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

时间:2012-10-20 15:56:38

标签: stl vector std c++

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

vector<int> V;

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

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

3 个答案:

答案 0 :(得分:11)

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

示例(see it work):

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;});
}

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

答案 1 :(得分:8)

我想我会使用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; });

对我来说,这会给3 6 8提供x中8,10和7的索引 - 正是我们想要的。

如果你坚持使用C ++ 98/03编译器/库,你将使用std::remove_copy_if代替(并改变比较的意义)。在这种情况下,您显然无法使用lambda进行比较。

答案 2 :(得分:1)

只是为了好玩,transform_if算法:

#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>

template<typename InputIterator, typename OutputIterator,
    typename UnaryPredicate, typename UnaryFunction>
OutputIterator
transform_if (InputIterator first, InputIterator last,
    OutputIterator result, UnaryPredicate pred,
    UnaryFunction func)
{
    for (; first != last; ++first, ++result)
        if (pred(*first))
            *result = func(*first);
    return result;
}

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

    size_t index = 0;
    transform_if(x.begin(), x.end(), std::back_inserter(indices),
        [&](int i){ return ++index, i > 5; },
        [&](int){ return index-1; });

    std::copy(indices.begin(), indices.end(),
              std::ostream_iterator<size_t>(std::cout, " "));
}

输出:3 6 8

相关问题