sal*_*eph 6 c++ string unordered-set c++11
我有一个无序的字符集
std::unordered_set<char> u_setAlphabet;
Run Code Online (Sandbox Code Playgroud)
然后我想从集合中获取std :: string的内容.我的实现现在看起来像这样:
std::string getAlphabet() {
std::string strAlphabet;
for (const char& character : u_setAlphabet)
strAlphabet += character;
return strAlphabet;
}
Run Code Online (Sandbox Code Playgroud)
这是解决此任务的好方法吗?对于大型u_setAlphabet(多个reallocs?),对字符串添加signle chars似乎不是最佳选择.还有其他方法吗?
xto*_*ofl 12
std::string有一个构造函数:
auto s = std::string(begin(u_setAlphabet), end(u_setAlphabet));
Run Code Online (Sandbox Code Playgroud)
Ker*_* SB 12
最简单,最易读和最有效的答案是:
return std:string(s.begin(), s.end());
Run Code Online (Sandbox Code Playgroud)
实现可以选择预先检测范围的长度并且仅分配一次; 当给定前向迭代器范围时,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;
Run Code Online (Sandbox Code Playgroud)
它还提供了assign,append和insert成员函数,而是因为那些提供强大的异常保证,他们可能有破坏旧人之前分配一个新的缓冲区(感谢@TC指出这个关键的细节!).如果现有容量足够,则libc ++实现不会重新分配,而GCC5的libstdc ++实现无条件地重新分配.
Vla*_*cow 10
最好使用acepts迭代器的构造函数.例如
std::string getAlphabet() {
return { u_setAlphabet.begin(), u_setAlphabet.end() };
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
375 次 |
| 最近记录: |