답변:
C ++ 11을 사용하면 할 수 있습니다. std::string(v.data())또는 벡터 '\0'의 끝에 a가 없으면 std::string(v.data(), v.size()).
string(&v[0], v.size())도 작동해야하지만 후에 만 assert(not v.empty());, 벡터가 비어 둘 경우 이후 v[0]및 v.front()정의되지 않은 동작을 호출한다. 즉, 주소 연산자를 사용할 필요가 없다는 구문상의 단순 성과는 별도로 data()빈 벡터에서도 작동하는 C ++ 11 함수 의 진정한 이점입니다 .
std::string(v.data())더 긴 문자열이 나올 수 있습니다. 따라서 이런 식으로 사용하지 마십시오.
std::string(v.data(), v.size())정확한 이유에 대해 답변에 명시 적으로 언급 된 의 문제는 무엇입니까 ?
완전성을 위해 다른 방법은 std::string(&v[0])(문자열이 null로 끝나고 std::string(v.data())일반적으로 선호되는 것을 확인해야하지만 .
차이점은 .data ()로는 할 수없는 버퍼를 수정하려는 함수에 벡터를 전달하기 위해 앞의 기술을 사용할 수 있다는 것입니다.
data()버퍼를 수정하는 데 사용할 수없는 이유는 무엇 입니까? data()상수가 아닌 벡터 를 호출 하면 a를 반환하는 것처럼 보입니다 T *(그리고 벡터가 const이면 'v [0]`은 T const &어쨌든 a를 반환 합니다).
v문자열 이면 참 이지만 대상 유형은 문자열이고 v벡터입니다. (하지만 C ++ 17 문자열을 벡터와 패리티를 줄 것이다 있는지 좋다.)
나는 Stefan의 대답 (Sep 11 '13)을 좋아하지만 조금 더 강하게 만들고 싶습니다.
벡터가 null 종결 자로 끝나는 경우 (v.begin (), v.end ())를 사용해서는 안됩니다. v.data ()를 사용해야합니다 (또는 C ++ 17 이전의 경우 & v [0]). .
v에 null 종결자가 없으면 (v.begin (), v.end ())를 사용해야합니다.
begin () 및 end ()를 사용하고 벡터에 종결 0이 있으면 문자열 "abc \ 0"으로 끝납니다. 예를 들어 길이가 4이지만 실제로는 "abc"여야합니다.
vector<char> vec;
//fill the vector;
std::string s(vec.begin(), vec.end());
std::vector<char> v2(std::move(v))a와 같은 일 을하는 것std::string입니다.