[英]How can I replace this for loop with an STL implementation?
我在这里有这个小的 for 循环(变量和类型重命名):
vector<Iterator> validIterators;
for (auto itr = someStartIterator; itr != someVector.end(); itr++)
{
if (itr->foo() && itr->bar())
validIterators.push_back(itr); // Notice that I'm not deferencing the iterator when adding it to the vector
}
...
for (const auto& itr : validIterators)
{
// Do stuff with the iterator explicitly (e.g. std::distance),
// and not the object that it points (at least not at first).
}
有什么方法可以使用 STL <algorithm>
函数来制作“更干净”的东西? 我不能在那种情况下使用 Boost,也不能使用 C++20 范围或范围 v3。
先感谢您。
就其性质而言,算法对值序列进行操作。 它们通过称为“迭代器”的中间对象与这些值序列进行交互。 但从实现的角度来看,这是一个实现细节。 可以肯定的是,这是必要的,但它仍然不是算法的真正组成部分。
因此,算法通常不会将迭代器暴露给用户提供的函子。 std::for_each
向函子传递一个从迭代器中提取的值,而不是迭代器本身。 std::sort
的谓词比较值对,而不是迭代器对。 std::copy_if
根据提供值的谓词复制值。 等等。 即使是基于范围的for
循环本身也不暴露迭代器。
算法通过它们的迭代器来操作值,而不是迭代器本身。
最好的办法是手动执行循环并将“对迭代器执行操作”部分折叠到条件测试部分中。
for (auto itr = someStartIterator; itr != someVector.end(); itr++)
{
if (itr->foo() && itr->bar())
{
// Do stuff with the `itr` explicitly (e.g. std::distance).
}
}
标准库算法使用迭代器来处理一些底层数据,而迭代器本身无法通过标准库算法获得。 您必须为此编写自己的算法。
例子:
template<class Iterator, class Func>
std::vector<Iterator> get_valid_iterators(Iterator Begin, Iterator End, Func f) {
std::vector<Iterator> rv;
for(; Begin != End; ++Begin)
if(f(Begin)) rv.push_back(Begin); // f is functor that can validate the iterator
return rv;
}
用法:
auto vi = get_valid_iterators(container.begin(), container.end(),
[](auto& it) { return it->foo() && it->bar(); });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.