我想知道如何找到驗證某個條件(例如大於)的元素的索引位置。例如,如果我有一個整型的矢量值獲取大於值的STL向量中元素的所有位置
vector<int> V;
五載值3 2 5 8 2 1 10 4 7
,我想所有的索引位置是元素的大於5 我知道std::find_if
但根據文檔,它只是找到滿足條件的第一個元素。
我想知道如何找到驗證某個條件(例如大於)的元素的索引位置。例如,如果我有一個整型的矢量值獲取大於值的STL向量中元素的所有位置
vector<int> V;
五載值3 2 5 8 2 1 10 4 7
,我想所有的索引位置是元素的大於5 我知道std::find_if
但根據文檔,它只是找到滿足條件的第一個元素。
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)
),並繼續搜索。
+1 std :: next' –
我想我會用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進行比較。
我喜歡它。好想法。 – chris
+1爲'std :: iota' –
只是爲了好玩,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
你可以用'的std :: find_if'在一個循環中,存儲位置,當您去。 – chris
反覆使用它,不是從一開始就從剛剛找到的地方開始。 –
@oldrinb其實我需要得到位置,因爲那樣我必須從另一個向量獲取相同位置的元素。 – saloua