获取STL向量中大于值的元素的所有位置

sal*_*oua 6 c++ stl vector std

我想知道如何找到验证某个条件(例如大于)的元素的索引位置.例如,如果我有一个int值向量

vector<int> V;
Run Code Online (Sandbox Code Playgroud)

V包含值 3 2 5 8 2 1 10 4 7

并且我想获得大于5的元素的所有索引位置.我知道std::find_if但是根据文档它只找到满足条件的第一个元素.

chr*_*ris 11

循环std::find_if,从你上次停止的地方开始.

样品(见工作):

std::vector<size_t> results;

auto it = std::find_if(std::begin(v), std::end(v), [](int i){return i > 5;});
while (it != std::end(v)) {
   results.emplace_back(std::distance(std::begin(v), it));
   it = std::find_if(std::next(it), std::end(v), [](int i){return i > 5;});
}
Run Code Online (Sandbox Code Playgroud)

首先,我们使用第一个结果设置迭代器.如果找不到,则while循环永远不会执行.否则,存储索引位置(std::distance基本上是更通用的it - std::begin(v)),并继续搜索.


Jer*_*fin 9

我想我会用std::copy_if:

std::vector<int> x{3, 2, 5, 8, 2, 1, 10, 4, 7};
std::vector<size_t> y(x.size());

std::iota(y.begin(), y.end(), 0);
std::copy_if(y.begin(), y.end(), 
             std::ostream_iterator<size_t>(std::cout, " "), 
             [&](size_t i) { return x[i] > 5; });
Run Code Online (Sandbox Code Playgroud)

对我来说,这给出3 6 8了8,10和7的指数x- 正是我们想要的.

如果您坚持使用C++ 98/03编译器/库,那么您将使用std::remove_copy_if(并反转比较的意义).在这种情况下,您显然无法使用lambda进行比较.