c++专业程序员如何实现公共抽象

visual how do C++ professional programmers implement common abstractions?

本文关键字:实现 抽象 程序员 何实现 c++      更新时间:2023-10-16

我从未专业地使用c++编程,并且在学生时代使用(Visual) c++。我很难处理抽象的缺乏,尤其是STL容器类。例如,vector类不包含一个简单的remove方法,而这在许多库(如。net Framework)中很常见。我知道有一个擦除方法,它没有使remove方法抽象到足以将操作减少到一行方法调用。例如,如果我有一个

std::vector<std::string>

我不知道如何从向量中删除字符串元素,而不迭代它并搜索匹配的字符串元素。

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)?还是别的什么?

(如果上面的remove操作需要工作,请留下替代方法来完成此操作,谢谢)

您可以使用"删除和擦除习语":

v.erase(std::remove(v.begin(), v.end(), mystring), v.end());

关键是vector是一个序列容器,不面向的操作。根据您的设计需要,使用不同的标准库容器可能更合适。

注意,remove算法只是重新排序范围内的元素,它不会从容器中擦除任何内容。这是因为迭代器不携带有关其容器的信息,这是完全有意的:通过将迭代器与其容器分离,可以编写适用于任何合理容器的泛型算法。

惯用的现代c++会尽可能遵循这种模式:通过迭代器公开数据,并使用泛型算法对其进行操作。

您考虑过std::remove_if吗?

http://www.cplusplus.com/reference/algorithm/remove_if/

在我看来,从专业角度来说,编写自定义实现来完成自定义任务是完全合乎逻辑的,尤其是在标准没有提供这些功能的情况下。这比一遍又一遍地写(读:复制粘贴)同样的东西要好得多。你也可以利用内联函数、模板函数、宏把同样的东西放在一个地方。这减少了在重用相同内容时可能遇到的任何bug(当粘贴时可能会出现一些错误)。这也使得在一个地方纠正错误成为可能。

模板和宏,如果设计得当,是非常有用的——它们不会造成代码膨胀。

编辑:你的代码需要改进:

  • bool remove(vector &msgs, consnt string&toRemove );
  • 在一个集合上迭代,一个for循环就足够了。不需要检查大小,使用最后一个迭代器,检查begin,获取数据和所有。
  • 不需要浪费一个string -只是比较它,并删除。

对于你的问题,我相信mapset会更适合。