我从来没有专业地使用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/

10-12 00:10
查看更多