如何从std :: vector <char>构造一个std :: string?

oom*_*pah 108 c++

缺少(显而易见的)构建C样式字符串然后使用它来创建std :: string,是否有更快/替代/"更好"的方式来从字符向量初始化字符串?

Gre*_*reg 188

好吧,最好的方法是使用以下构造函数:

template<class InputIterator> string (InputIterator begin, InputIterator end);
Run Code Online (Sandbox Code Playgroud)

这将导致类似于:

std::vector<char> v;
std::string str(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助.


LiM*_*Bei 39

我想你可以做到

std::string s( MyVector.begin(), MyVector.end() );
Run Code Online (Sandbox Code Playgroud)

其中MyVector是你的std :: vector.

  • 除了在 VS2013 中,它在运行时断言无效迭代器,除非您设置 `_ITERATOR_DEBUG_LEVEL=1` (在这种情况下它似乎工作正常)。 (2认同)

小智 34

随着C++ 11,你可以做std::string(v.data()),或者如果你的载体不包含'\0'末,std::string(v.data(), v.size()).

  • @Jamie:顺便说一句,在 C++98 中, `string(&amp;v[0], v.size())` 也应该起作用,但只能在 `assert(not v.empty());` 之后,因为 if向量为空,“v[0]”和“v.front()”都会调用未定义的行为。除了不必使用地址运算符的语法简单性之外,这是 C++11 的“data()”函数的真正好处,它甚至可以在空向量上工作。 (2认同)

Mar*_*one 12

std::string s(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)

其中v几乎是可迭代的.(特别是begin()和end()必须返回InputIterators.)


小智 5

我喜欢 Stefan 的回答(2013 年 9 月 11 日),但想让它更强大一点:

如果向量以空终止符结尾,则不应使用 (v.begin(), v.end()):您应该使用 v.data()(对于 C++17 之前的那些,应使用 &v[0]) .

如果 v 没有空终止符,则应使用 (v.begin(), v.end())。

如果您使用 begin() 和 end() 并且向量确实有一个终止零,那么您最终会得到一个字符串“abc\0”,例如,长度为 4,但实际上应该只是“abc”。