如何有效地将 std::vector<char> 复制到 std::string

How to efficiently copy a std::vector<char> to a std::string

本文关键字:std gt 复制 string char 有效地 vector lt      更新时间:2023-10-16

这个问题的另一面是如何有效地将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() );

在不降低效率的情况下可能更安全。