2012-10-20 38 views
5

我想知道如何找到驗證某個條件(例如大於)的元素的索引位置。例如,如果我有一個整型的矢量值獲取大於值的STL向量中元素的所有位置

vector<int> V; 

五載值3 2 5 8 2 1 10 4 7

,我想所有的索引位置是元素的大於5 我知道std::find_if但根據文檔,它只是找到滿足條件的第一個元素。

+2

你可以用'的std :: find_if'在一個循環中,存儲位置,當您去。 – chris

+1

反覆使用它,不是從一開始就從剛剛找到的地方開始。 –

+0

@oldrinb其實我需要得到位置,因爲那樣我必須從另一個向量獲取相同位置的元素。 – saloua

回答

8

Loop 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)),並繼續搜索。

+0

+1 std :: next' –

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,8,10指數和7 x - 正是我們想要的。如果你被困在C++ 98/03編譯器/庫中,你將使用std::remove_copy_if來代替(並且顛倒比較的意義)。在這種情況下,您顯然無法使用lambda進行比較。

+0

我喜歡它。好想法。 – chris

+2

+1爲'std :: iota' –

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

相關問題