这个问题是与如何有效地将std::string复制到vector中相反的一面
我通常这样复制向量(空终止字符串)
std::string s((char*)&v[0]);
或者(如果字符串已经被声明)像这样
s = (char*)&v[0];
虽然它能完成工作,但也许有更好的方法。
编辑
据说C风格的强制类型转换很丑陋,那么这个怎么样?
s = reinterpret_cast<char*>(&vo[0]);
这个问题是与如何有效地将std::string复制到vector中相反的一面
我通常这样复制向量(空终止字符串)
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]
如果您的字符串以空字符结尾并且希望省略终止符,则可以使用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
assign
成员函数,它可以接收与构造函数相同的参数。 - Dave Sstd::string s( &v[ 0 ] );
在Visual C++ 2005中,生成的汇编代码行数不到一半
std::string s( v.begin(), v.end() );
execution_time = #_instructions_executed * cycles_per_instruction * clock_cycle_time
,所以执行指令更少的东西将会更快地执行,并且从这个角度来看更有效率。记住软件工程第一法则——“每个软件工程师都应该大致知道他们的代码生成了什么汇编语言。” - Gnawmestd::string onoc( &ono[ 0 ], ono.size() );
: 19行汇编,1个构造函数调用std::string onos( ono.begin(), ono.end() );
: 30行汇编,2个构造函数调用。关注代码设计和编码决策所产生的后果以及编译器优化的影响,是成为专业编码人员的一部分(特别是在嵌入式/移动领域)。 - Gnawmes.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() );
...可能更安全,而不会失去效率。
::std::copy
方法在调用 s.resize();
之前是无法正常工作的。 - Omnifarious.data()
+ v.size()
构造或复制是最快的选项。从begin/end迭代器对中构造是最慢的。你列出的第一种方法是第二慢的,但这是因为.resize
必须先初始化所有内容。 - Omnifarious