C++ 如何有效地复制std::vector<;char>;到std::字符串

C++ 如何有效地复制std::vector<;char>;到std::字符串,c++,stdvector,stdstring,C++,Stdvector,Stdstring,这个问题与此相反 我通常以这种方式复制向量(以null结尾的字符串) 或者(如果已经声明了字符串)如下所示 s = (char*)&v[0]; 它完成了任务,但也许有更好的方法。 编辑 C型演员很难看,有人告诉我这是怎么回事 s = reinterpret_cast<char*>(&vo[0]); s=reinterpret_cast(&vo[0]); 你可能会问为什么。。。因为一旦那些该死的编译器创建者理解了标准化的力量,这种方法将比任何其他方法都快得多 更严

这个问题与此相反
我通常以这种方式复制向量(以null结尾的字符串)

或者(如果已经声明了字符串)如下所示

s = (char*)&v[0];
它完成了任务,但也许有更好的方法。

编辑

C型演员很难看,有人告诉我这是怎么回事

s = reinterpret_cast<char*>(&vo[0]);
s=reinterpret_cast(&vo[0]);
你可能会问为什么。。。因为一旦那些该死的编译器创建者理解了标准化的力量,这种方法将比任何其他方法都快得多

更严重的是:

std::string( (char*)v.data(), v.size() );
s.assign( (char*)v.data(), v.size() );

。。。可能更安全,而不会降低效率。

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

std::string s(v.begin(), v.end());
std::string s(v.data(), v.size());   // or &v[0]
std::string s(v.data());             // or &v[0]
(编辑):或使用字符指针加大小构造函数:

std::string s(v.begin(), v.end());
std::string s(v.data(), v.size());   // or &v[0]
std::string s(v.data());             // or &v[0]
如果字符串以null结尾,并且希望省略终止符,则使用
char*
-构造函数:

std::string s(v.begin(), v.end());
std::string s(v.data(), v.size());   // or &v[0]
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

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

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

除非调用
s.resize(),否则
::std::copy
方法将不起作用第一。@Kornel在我看来,你的std::copy答案很好。让它成为“严肃的”一个怎么样?你的答案更好,因为它不依赖于构造函数或赋值,因为你知道你在给它们提供随机访问迭代器。尽管C风格的强制转换仍然很难看,
copy
选项生成的代码显然效率最高。其他的结果是调用一个可能有效的函数。从
.data()
+
v.size()
构造或复制是所有情况下最快的选择。从开始/结束迭代器对构造是最慢的。您列出的第一个方法,即您愚蠢的方法是第二慢的,但这是因为
.resize
必须首先初始化所有内容。如果字符串是预先声明的,例如作为成员变量,该怎么办。i、 e.你没有机会打电话给constructor@kairmjee使用
assign
member函数,该函数可以采用与构造函数相同的参数。@Dave您可以改进这个答案吗?因为重要的是,该用例添加了赋值语法。谢谢,戴夫!请注意,此处以null结尾的情况性能较差,因为std::string构造函数必须在复制字符串之前扫描字符串一次以确定其长度。所以你是说大多数选票的答案实际上并没有比我目前所做的改善那么多。在效率方面anyway@karimjee:生成的装配线数量是效率的一个具体度量。按照这个标准,你已经在做的事情是最有效的。我怀疑s(&v[0],v.length())可能更有效(也更安全),但我现在远离我的Windows机器…@karimjee:我的怀疑是错误的;s(&v[0])和s(&v[0],v.size())在VS 2005中生成相同数量的装配线。顺便说一句,如果你喜欢我的答案,请投票。如果这是你想要的答案,请接受它。生成的汇编的行数可能是具体的,但很少有任何实际用途。在上面的例子中,我仍然会使用第二个版本,因为它会更有效(因为它已经知道字符串的大小,并且可以预先分配空间):19行程序集,1个构造函数调用
std::string onos(ono.begin(),ono.end()):30行汇编,2个构造函数调用。关注您的设计和编码决策生成的代码,以及编译器优化的结果,这只是成为专业编码人员的一部分。(特别是在嵌入式/移动空间)无需石膏&v[0]产生一个字符*;string有一个接受const char*的构造函数;将char*转换为const char*不需要强制转换。