这个问题的另一面是如何有效地将std::字符串复制到向量中
我通常以这种方式复制矢量(以null结尾的字符串(
std::string s((char*)&v[0]);
或者(如果字符串已经声明(如下
s = (char*)&v[0];
它完成了任务,但也许还有更好的方法
编辑
C风格的演员阵容很难看,有人告诉我这是怎么回事
s = reinterpret_cast<char*>(&vo[0]);
只需使用迭代器构造函数:
std::string s(v.begin(), v.end());
(编辑(:或者使用字符指针加大小构造函数:
std::string s(v.data(), v.size()); // or &v[0]
如果您的字符串以null结尾,并且希望省略终止符,则使用char*
-构造函数:
std::string s(v.data()); // or &v[0]
更新:正如@Dave所说,您可以使用相同的语法来分配给现有字符串:
s.assign(v.begin(), v.end());
s.assign(v.data(), v.size()); // pointer plus size
s.assign(v.data()); // null-terminated
std::string s( &v[ 0 ] );
在Visual C++2005中生成的汇编代码行数不到的一半
std::string s( v.begin(), v.end() );
s.resize( v.size() );
std::copy( v.begin(), v.end(), s.begin() );
你可能会想为什么。。。因为一旦那些该死的编译器创建者了解了标准化的力量,这种方法将比任何其他方法都快得多。。。
更严重的是:
std::string( (char*)v.data(), v.size() );
s.assign( (char*)v.data(), v.size() );
在不降低效率的情况下可能更安全。