当前位置:  开发笔记 > 编程语言 > 正文

从std :: unordered_set <char>有效构造std :: string

如何解决《从std::unordered_set<char>有效构造std::string》经验,为你挑选了3个好方法。

我有一个无序的字符集

std::unordered_set u_setAlphabet;

然后我想从集合中获取std :: string的内容.我的实现现在看起来像这样:

std::string getAlphabet() {
    std::string strAlphabet;
    for (const char& character : u_setAlphabet)
        strAlphabet += character;
    return strAlphabet;
}

这是解决此任务的好方法吗?对于大型u_setAlphabet(多个reallocs?),对字符串添加signle chars似乎不是最佳选择.还有其他方法吗?



1> xtofl..:

std::string有一个构造函数:

auto s = std::string(begin(u_setAlphabet), end(u_setAlphabet));



2> Kerrek SB..:

最简单,最易读和最有效的答案是:

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

实现可以选择预先检测范围的长度并且仅分配一次; 当给定前向迭代器范围时,libc ++和libstdc ++都会这样做.

string班还为您提供reserve,就像vector,管理能力:

std::string result
result.reserve(s.size());
for (unsigned char c : s) result.push_back(c);   // or std::copy
return result;

它还提供了assign,appendinsert成员函数,而是因为那些提供强大的异常保证,他们可能有破坏旧人之前分配一个新的缓冲区(感谢@TC指出这个关键的细节!).如果现有容量足够,则libc ++实现不会重新分配,而GCC5的libstdc ++实现无条件地重新分配.


@saleph不,因为`std :: set :: iterator`只满足BidirectionalIterator`std :: distance`因此是O(N)操作.但是,`std :: set :: size`是一个恒定时间操作.
只有当你知道自己真的处于性能关键代码并且通过测量它找到了差异时,我才会推荐`reserve()`代码.它会破坏你的代码,但如果增益合理,那就没关系.即使构造函数采用迭代器,一个好的标准库实现也只会保留一次内存.你得到的唯一开销就是遍历前面找到大小的遍历.

3> Vlad from Mo..:

最好使用acepts迭代器的构造函数.例如

std::string getAlphabet() {
    return { u_setAlphabet.begin(), u_setAlphabet.end() };
}

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有