【发布时间】:2009-04-09 13:26:38
【问题描述】:
我在std::for_each、bind 等中使用了很多STL 代码,但我注意到有时STL 的使用并不是一个好主意。
例如,如果您有一个std::vector 并想对向量的每个项目执行一个操作,您的第一个想法是使用这个:
std::for_each(vec.begin(), vec.end(), Foo())
它优雅而好,有一段时间。但是随后出现了第一组错误报告,您必须修改代码。现在你应该添加参数来调用Foo(),所以现在它变成了:
std::for_each(vec.begin(), vec.end(), std::bind2nd(Foo(), X))
但这只是临时解决方案。现在项目正在成熟,您更好地理解业务逻辑并且您想要对代码添加新的修改。正是在这一点上,您意识到您应该使用旧好的:
for(std::vector::iterator it = vec.begin(); it != vec.end(); ++it)
这种情况只发生在我身上吗?你在你的代码中识别出这种模式吗?你有没有遇到过使用STL 的类似反模式?
【问题讨论】:
-
顺便说一句,如果在您的第二个示例中,“X”对于所有元素都是相同的。只需将它传递给 Foo 的构造函数并将其存储在仿函数中,而不是绑定它。简单得多。
-
你实际上没有使用任何 STL,所以你很安全 :)
-
只是一种意见,但“太多”是指您使用并非仅仅为了使用它们而需要的功能。如果它有帮助,请使用它。如果您担心名称过长,您始终可以使用 typedef 或命名空间别名来缩短它们(例如,
typedef std::vector::iterator VecIter;)。标准库的问题是,它通常是在给定编译器上做某事的最干净的通用方法,仅仅是因为编译器的创建者或最了解它的人(如果不是创建者)将编写它的实现。不要害怕在有用的时候使用它。
标签: c++ stl coding-style