我从来没有专业地使用C++进行编程,也从未像学生一样使用(Visual)C++进行编程。我很难处理缺少抽象的问题,尤其是STL container classes。例如,vector类不包含许多库中常见的简单remove方法,例如.NET Framework。我知道有一个erase方法,它不能使remove方法足够抽象,以至于无法将操作简化为单行方法调用。例如,如果我有一个
std::vector<std::string>
我不知道如何从 vector 中删除一个字符串元素,而无需对其进行迭代并搜索匹配的字符串元素。
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;
}
在这种情况下,专业的C++程序员会做什么?您是否每次都写出实现方案?您是创建自己的容器类,自己的帮助器函数库还是建议使用其他库,即Boost(即使您在Visual Studio中对Windows进行编程)?或者是其他东西?
(如果上面的删除操作需要工作,请留下替代的方法,谢谢。)
最佳答案
您将使用“删除和删除惯用语”:
v.erase(std::remove(v.begin(), v.end(), mystring), v.end());
关键是
vector
是一个序列容器,并不适合按值进行操作。根据您的设计需求,不同的标准库容器可能更合适。请注意,
remove
算法仅对范围内的元素进行重新排序,而不会从容器中删除任何内容。这是因为迭代器不会随身携带有关其容器的信息,而这完全是故意的:通过将迭代器与容器分离,可以编写可在任何明智的容器上工作的通用算法。惯用的现代C++将在适用的情况下尝试遵循这种模式:通过迭代器公开数据并使用通用算法进行操作。
关于c++ - C++专业程序员如何实现通用抽象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6565371/