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

时间:2011-09-12 01:55:28

标签: c++ stdvector stdstring

这个问题是How to efficiently copy a std::string into a vector的另一面 我通常以这种方式复制向量(空终止字符串)

std::string s((char*)&v[0]);

或(如果已经声明了字符串),如此

s = (char*)&v[0];

它完成了工作,但也许有更好的方法。

修改

C风格的演员阵容很丑陋,我被告知这个怎么样

s = reinterpret_cast<char*>(&vo[0]);

3 个答案:

答案 0 :(得分:13)

只需使用迭代器构造函数:

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

Edit ):或者使用char-pointer-plus-size构造函数:

std::string s(v.data(), v.size());   // or &v[0]

如果你的字符串以null结尾并且你想省略终止符,那么使用char* - 构造函数:

std::string s(v.data());             // or &v[0]

更新:正如@Dave所说,您可以对assigning使用与现有字符串相同的语法:

s.assign(v.begin(), v.end());
s.assign(v.data(), v.size());  // pointer plus size
s.assign(v.data());            // null-terminated

答案 1 :(得分:9)

std::string s( &v[ 0 ] );

在Visual C ++ 2005中生成的汇编代码行数不到一半

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

答案 2 :(得分:1)

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() );

......可能更安全,不会失去效率。