除了(显而易见的)先构建一个 C 样式的字符串,然后使用它来创建一个 std: : string 之外,是否有一种更快/更好的方法来从一个向量的 char 初始化一个字符串?
我觉得你可以
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.data())
'\0'
std::string(v.data(), v.size())
为了完整起见,另一种方法是 std::string(&v[0])(尽管您需要确保您的字符串以 null 结尾,并且通常首选 std::string(v.data()))。
std::string(&v[0])
不同之处在于,您可以使用前一种技术将向量传递给希望修改缓冲区的函数,而这是无法实现的。资料()。
我喜欢斯特凡的回答(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());