如何有效地复制 std::vector到 std::string

发布于 2024-12-04 05:21:51 字数 478 浏览 0 评论 0 原文

这个问题是这个问题的另一面 如何有效地复制 std ::字符串转换为向量
我通常以这种方式复制向量(空终止字符串)

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

或(如果字符串已经被声明)这样

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

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

编辑

C 风格的强制转换很难看,有人告诉我这又如何

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

This question is a flip side of this How to efficiently copy a std::string into a vector
I typically copy the vector this way ( null terminated string )

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

or ( if the string has already been declared ) like this

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

It gets the job done but perhaps there are better ways.

EDIT

C-style casts are ugly, I am told so what about this

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

病女 2024-12-11 05:21:51

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

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

编辑):或者使用 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所说,您可以对 分配 给现有字符串:

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

Just use the iterator constructor:

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

(Edit): Or use the char-pointer-plus-size constructor:

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

If your string is null-terminated and you want to omit the terminator, then use a char*-constructor:

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

Update: As @Dave says, you can use the same syntax for assigning to an existing string:

s.assign(v.begin(), v.end());
s.assign(v.data(), v.size());  // pointer plus size
s.assign(v.data());            // null-terminated
梦晓ヶ微光ヅ倾城 2024-12-11 05:21:51
std::string s( &v[ 0 ] );

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

std::string s( v.begin(), v.end() );
std::string s( &v[ 0 ] );

generates less than half the number of lines of assembly code in Visual C++ 2005 as

std::string s( v.begin(), v.end() );
别想她 2024-12-11 05:21:51
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() );

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

s.resize( v.size() );
std::copy( v.begin(), v.end(), s.begin() );

You may as why... because once those damn compiler creators understand the power of standarization, this method will be way faster than any other...

And on a more serious note:

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

... might be safer, without loosing efficiency.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文