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

时间:2011-02-25 08:38:54

标签: c++

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

7 个答案:

答案 0 :(得分:175)

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

template<class InputIterator> string (InputIterator begin, InputIterator end);

会导致类似:

std::vector<char> v;
std::string str(v.begin(), v.end());

答案 1 :(得分:38)

我认为你可以做到

std::string s( MyVector.begin(), MyVector.end() );

其中MyVector是你的std :: vector。

答案 2 :(得分:33)

使用C ++ 11,您可以执行std::string(v.data()),或者,如果您的向量最后不包含'\0',则std::string(v.data(), v.size())

答案 3 :(得分:12)

std::string s(v.begin(), v.end());

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

答案 4 :(得分:3)

为了完整起见,另一种方式是std::string(&v[0])(尽管您需要确保您的字符串以空值终止,并且std::string(v.data())通常是首选。

不同之处在于您可以使用前一种技术将向量传递给想要修改缓冲区的函数,而无法使用.data()。

答案 5 :(得分:1)

我喜欢Stefan的回答(13年9月11日),但希望使其更强:

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

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

如果您使用begin()和end()并且向量确实有一个终止的零,那么您将以字符串“ abc \ 0”结尾,例如,长度为4,但实际上只能是“ abc”。

答案 6 :(得分:0)

vector<char> vec;
//fill the vector;
std::string s(vec.begin(), vec.end());