如何有效地将std :: string复制到向量中

mol*_*ita 2 c++ stdstring stdvector

我有一个字符串

std::string s = "Stack Overflow";
Run Code Online (Sandbox Code Playgroud)

我需要复制到矢量中.这就是我这样做的方式

std::vector<char> v;
v.reserve(s.length()+1);
for(std::string::const_iterator it = s.begin(); it != s.end(); ++it)
{
    v.push_back( *it );
}
v.push_back( '\0' );
Run Code Online (Sandbox Code Playgroud)

但我听说范围操作更有效率.所以我在想这样的事情

std::vector<char> v( s.begin(), s.end());
v.push_back('\0');
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,这样做会更好吗?插入'\ 0'时潜在的重新分配怎么样?
我想的另一种方法就是这样

std::vector<char> v(s.length()+1);
std::strcpy(&v[0],s.c_str());
Run Code Online (Sandbox Code Playgroud)

也许速度快但可能不安全?
编辑
必须是一个空终止字符串,可以在C函数内使用(读/写)

Kon*_*lph 6

如果你真的需要一个向量(例如,因为你的C函数修改了字符串内容),那么下面的代码应该在一行中给你你想要的东西:

std::vector<char> v(s.c_str(), s.c_str() + s.length() + 1);
Run Code Online (Sandbox Code Playgroud)

由于c_str()返回以null结尾的字符串,您只需将其整个复制到向量中即可.

但是,我实际上并不确定这个构造函数是如何优化的.我知道std::copy是优化的,因为它得到的,所以也许(测!)下面是快:

std::vector<char> v(s.length() + 1);
std::copy(s.c_str(), s.c_str() + s.length() + 1, v.begin());
Run Code Online (Sandbox Code Playgroud)

如果C函数没有修改字符串,只需c_str()直接传递,然后抛弃const-ness.只要 C函数只从字符串中读取,这是安全的.

  • @Steve呃.Juck!不喜欢低级C函数,其中C++算法在概念上更加清晰,并且从根本上可以根据类型信息进行更多优化.没有一个案例`memcpy`应该能够更好地执行(除了关于重叠内存的点). (4认同)