C++专业程序员如何实现常见的抽象?

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)?或者是其他东西?

(如果上面的删除操作需要工作,请留下另一种方法,谢谢.)

Ker*_* SB 9

你会使用"删除和删除成语":

v.erase(std::remove(v.begin(), v.end(), mystring), v.end());
Run Code Online (Sandbox Code Playgroud)

关键在于它vector是一个序列容器,而不是按进行操作.根据您的设计需要,不同的标准库容器可能更合适.

请注意,该remove算法仅重新排序范围的元素,它不会从容器中删除任何内容.这是因为迭代器不会携带有关它们的容器的信息,这完全是故意的:通过将迭代器与容器分开,可以编写适用于任何敏感容器的通用算法.

惯用的现代C++会在适用的情况下尝试遵循该模式:通过迭代器公开您的数据并使用通用算法来操纵它.

  • @T.Webster:在Visual Studio上使用Boost并不难.事实上,我认为它更容易,因为Boost支持Visual Studio的自动链接功能.boostpro为预编译提供了方便的安装程序[这里](http://boostpro.com/download/) (2认同)
  • @Tilman:请注意,操作向您显示"删除"+"擦除"的成本这一事实并不会使其成本更高.由于连续的内存是不变的,从中间移除元素的成本*总是*在容器的大小上是线性的.STL(我正在使用STL,因为我指的是原始的Stepanov库)专注于通用性和性能,只要有一个可以在特定容器中更有效地实现的操作,该操作就被添加到容器本身. (2认同)
  • ...在这种特殊情况下,与您在评论中指出的相反,*remove + erase*惯用语的成本对于向量和列表是相同的,但在列表的情况下,可以更有效地实现相同的操作因此,`std :: list`实现了自己特定的`remove`函数作为成员.性能问题是用户需要解决的问题,而不是库.如果你需要使用矢量*remove-erase*尽可能快,如果你需要更快的速度,不要使用矢量. (2认同)