c++专业程序员如何实现公共抽象
visual how do C++ professional programmers implement common abstractions?
我从未专业地使用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
-只是比较它,并删除。
对于你的问题,我相信map
或set
会更适合。
相关文章:
- 如何在从抽象基派生的类中实现相同的方法?
- 硬件抽象层 (HAL) 中实现的动态切换
- 下面抽象工厂设计模式的实现是正确的吗
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 使用抽象类的类和实现此抽象类的创建对象
- GMock - 用另一个实现模拟抽象类
- 如何在抽象基类中实现运算符+
- 类中的多态函数,实现抽象类
- 从继承的类中实现抽象方法
- 在C++中实现抽象工厂 PIMPL 习语的运行时错误
- 如何正确实现抽象类
- 为不同的形状实现抽象的"重叠"方法?
- C++:使用模板化类来实现抽象类
- 如何在可变上下文中使用抽象类时实现抽象方法
- 在c++中实现抽象接口的操作符重载
- 在父类中实现抽象类成员
- 如何在c++中实现抽象类,同时允许子类方法调用
- 这个程序是如何实现抽象概念的
- 关于在c++中实现抽象函数的问题