如何从 std: : Vector < char > 构造 std: : string?

除了(显而易见的)先构建一个 C 样式的字符串,然后使用它来创建一个 std: : string 之外,是否有一种更快/更好的方法来从一个向量的 char 初始化一个字符串?

134082 次浏览

我觉得你可以

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

其中 MyVector 是您的 std: : Vector。

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

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

会导致这样的结果:

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

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

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

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

不同之处在于,您可以使用前一种技术将向量传递给希望修改缓冲区的函数,而这是无法实现的。资料()。

我喜欢斯特凡的回答(9月11日13日) ,但我想让它更强烈一点:

如果向量以空结束符结束,那么不应该使用(v.start () ,v.end ()) : 应该使用 v.data ()(或 & v [0]来表示 C + + 17之前的结束符)。

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

如果您使用 start ()和 end () ,并且向量确实有一个结束零,那么您将得到一个字符串“ abc 0”,例如,它的长度为4,但实际上应该只有“ abc”。

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