我有一个无序的字符集
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似乎不是最佳选择。还有其他方法吗?
答案 0 :(得分:12)
std::string
有a 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;
它还提供assign
,append
和insert
成员函数,但由于这些函数提供强大的异常保证,因此可能需要在销毁旧缓冲区之前分配新的缓冲区(谢谢到@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解决方案,因为我们不需要对临时对象的返回类型做出任何假设。