书中C++ Core Guidelines Explained: Best Practices for Modern C++有一句话:
\n\n现代C++中有一句谚语:\xe2\x80\x9c当你使用显式循环时,你不\xe2\x80\x99不知道STL的算法。\xe2\x80\x9d
\n
我现在正在编写一个程序,它使用显式的 for 循环,在每次迭代中更改变量指向的对象,直到它指向nullptr.
for(auto object = get_object(arg);object != nullptr;object = get_object_next(arg)) {\n if (condition) {\n vector_of_objects.push_back(object);\n }\n }\nRun Code Online (Sandbox Code Playgroud)\n哪种 STL 函数比显式 for 循环更适合这种情况?
\n算法最终是建立在迭代器之上的。你的循环不是。因此,没有算法来拟合它。
现在,如果您get_object/get_object_next经常使用这个特定的接口,那么开发它的迭代器/范围版本可能是值得的。据推测,这将是某种形式的 InputIterator/Range。迭代器将存储arg当前对象。++会将当前对象替换为get_object_next(arg). 这是一个非常简单的接口,C++20 概念系统使编写一致的迭代器比以往任何时候都更容易(至少,很容易检查它是否是有效的std::input_iterator)。
但如果只有几个地方使用这些循环,则可能不值得。
当然,“几个地方”和“经常使用”是可能随着时间而改变的状态。因此,如果您认为可能会经常使用范围/迭代器接口,那么提供范围/迭代器接口可能是值得的。