T. *_*ter 9 c++ stl visual-c++
我从来没有专业地使用C++编程并且使用(Visual)C++作为学生.我很难处理缺少抽象的问题,尤其是STL容器类.例如,vector类不包含一个简单的remove方法,在许多库中很常见,例如.NET Framework.我知道有一种擦除方法,它不会使remove方法足够抽象以减少对单行方法调用的操作.例如,如果我有
std::vector<std::string>
Run Code Online (Sandbox Code Playgroud)
我不知道如何从矢量中删除字符串元素而不通过它迭代并搜索匹配的字符串元素.
bool remove(vector<string> & msgs, string toRemove) {
if (msgs.size() > 0) {
vector<string>::iterator it = msgs.end() - 1;
while (it >= msgs.begin()) {
string remove = it->data();
if (remove == toRemove) {
//std::cout << "removing '" << it->data() << "'\n";
msgs.erase(it);
return true;
}
it--;
}
}
return false;
Run Code Online (Sandbox Code Playgroud)
}
在这种情况下,专业C++程序员会做些什么?你每次都写出来吗?您是否创建了自己的容器类,自己的辅助函数库,或者您是否建议使用另一个库,即Boost(即使您在Visual Studio中编写Windows)?或者是其他东西?
(如果上面的删除操作需要工作,请留下另一种方法,谢谢.)
你会使用"删除和删除成语":
v.erase(std::remove(v.begin(), v.end(), mystring), v.end());
Run Code Online (Sandbox Code Playgroud)
关键在于它vector是一个序列容器,而不是按值进行操作.根据您的设计需要,不同的标准库容器可能更合适.
请注意,该remove算法仅重新排序范围的元素,它不会从容器中删除任何内容.这是因为迭代器不会携带有关它们的容器的信息,这完全是故意的:通过将迭代器与容器分开,可以编写适用于任何敏感容器的通用算法.
惯用的现代C++会在适用的情况下尝试遵循该模式:通过迭代器公开您的数据并使用通用算法来操纵它.
| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |