如何有效地将 std::vector<char> 复制到 std::string
How to efficiently copy a std::vector<char> to a std::string
这个问题的另一面是如何有效地将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() );
在不降低效率的情况下可能更安全。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 是std :: set&lt; std :: future&gt;不可能存在
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- 使用 std::vector<boost::shared_ptr<Base_Class>> 或 boost::p tr_vector 的性能注意事项是什么<Base>
- std::map<std::set, double> AND std:<long>map< std::p air<long, long>, double>
- 如何获取std::vector<DMatch>