【发布时间】:2020-03-21 05:12:21
【问题描述】:
我在这里有这个小 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 范围或 range-v3。
提前谢谢你。
【问题讨论】:
-
如果我理解正确你可以使用标准算法 std::copy_if
-
...变成
back_inserter。 -
@VladfromMoscow 最初是我的直觉,但我确实需要实际的迭代器,而不是它指向的对象的副本。
-
@FireYoshi -- ??当您使用
copy_if时,您正在获取迭代器。 -
@PaulMcKenzie
copy_if提供的唯一迭代器是“目标范围内元素的迭代器,在复制的最后一个元素之后”作为其返回值。否则元素将按值复制:en.cppreference.com/w/cpp/algorithm/copy
标签: c++ functional-programming stl iterator c++17