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

时间:2015-12-30 11:40:13

标签: c++ string c++11 unordered-set

我有一个无序的字符集

std::unordered_set<char> 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似乎不是最佳选择。还有其他方法吗?

4 个答案:

答案 0 :(得分:12)

std::stringa constructor

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

答案 1 :(得分:12)

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

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;

它还提供assignappendinsert成员函数,但由于这些函数提供强大的异常保证,因此可能需要在销毁旧缓冲区之前分配新的缓冲区(谢谢到@TC指出这个至关重要的细节!)。如果现有容量足够,则libc ++实现不会重新分配,而GCC5的libstdc ++实现无条件地重新分配。

答案 2 :(得分:10)

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

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

答案 3 :(得分:1)

{+ 1}}和return std::string(u_setAlphabet.begin(), u_setAlphabet.end());在C ++ 11中都是相同的。我更喜欢@VladfromMoscow解决方案,因为我们不需要对临时对象的返回类型做出任何假设。