(분명한) C 스타일 문자열을 먼저 빌드 한 다음이를 사용하여 std :: string을 만드는 것이 부족합니다. 문자 벡터에서 문자열을 초기화하는 더 빠르고 / 대안 / “더 나은”방법이 있습니까?
답변
음, 가장 좋은 방법은 다음 생성자를 사용하는 것입니다.
template<class InputIterator> string (InputIterator begin, InputIterator end);
다음과 같은 결과가 나타납니다.
std::vector<char> v;
std::string str(v.begin(), v.end());
답변
나는 당신이 할 수 있다고 생각합니다
std::string s( MyVector.begin(), MyVector.end() );
여기서 MyVector는 std :: vector입니다.
답변
C ++ 11을 사용하면 할 수 있습니다. std::string(v.data())
또는 벡터 '\0'
의 끝에 a가 없으면 std::string(v.data(), v.size())
.
답변
std::string s(v.begin(), v.end());
v는 반복 가능한 거의 모든 것입니다. (특히 begin () 및 end ()는 InputIterators를 반환해야합니다.)
답변
완전성을 위해 다른 방법은 std::string(&v[0])
(문자열이 null로 끝나고 std::string(v.data())
일반적으로 선호되는 것을 확인해야하지만 .
차이점은 .data ()로는 할 수없는 버퍼를 수정하려는 함수에 벡터를 전달하기 위해 앞의 기술을 사용할 수 있다는 것입니다.
답변
나는 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());