我有一个无序的字符集
std::unordered_setu_setAlphabet;
然后我想从集合中获取std :: string的内容.我的实现现在看起来像这样:
std::string getAlphabet() { std::string strAlphabet; for (const char& character : u_setAlphabet) strAlphabet += character; return strAlphabet; }
这是解决此任务的好方法吗?对于大型u_setAlphabet(多个reallocs?),对字符串添加signle chars似乎不是最佳选择.还有其他方法吗?
std::string
有一个构造函数:
auto s = std::string(begin(u_setAlphabet), end(u_setAlphabet));
最简单,最易读和最有效的答案是:
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 ++实现无条件地重新分配.
最好使用acepts迭代器的构造函数.例如
std::string getAlphabet() { return { u_setAlphabet.begin(), u_setAlphabet.end() }; }