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

kar*_*jee 5 c++ stdstring stdvector

这个问题是本文的另一面如何有效地将std :: string复制到向量中
我通常以这种方式复制向量(null终止字符串)

std::string s((char*)&v[0]);
Run Code Online (Sandbox Code Playgroud)

或者(如果已经声明了字符串)就像这样

s = (char*)&v[0];
Run Code Online (Sandbox Code Playgroud)

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

编辑

C风格的演员是丑陋的,我被告知这是怎么回事

s = reinterpret_cast<char*>(&vo[0]);
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 13

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

std::string s(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)

(编辑):或者使用char-pointer-plus-size构造函数:

std::string s(v.data(), v.size());   // or &v[0]
Run Code Online (Sandbox Code Playgroud)

如果您的字符串以null结尾并且您想省略终止符,那么使用char*-constructor:

std::string s(v.data());             // or &v[0]
Run Code Online (Sandbox Code Playgroud)

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

s.assign(v.begin(), v.end());
s.assign(v.data(), v.size());  // pointer plus size
s.assign(v.data());            // null-terminated
Run Code Online (Sandbox Code Playgroud)

  • @kairmjee使用`assign`成员函数,它可以使用与构造函数相同的参数. (3认同)

Gna*_*wme 9

std::string s( &v[ 0 ] );
Run Code Online (Sandbox Code Playgroud)

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

std::string s( v.begin(), v.end() );
Run Code Online (Sandbox Code Playgroud)