C++ 查找std::vector中满足条件的最后一个元素
我需要找到向量中小于某个值的最后一个元素 比如先找,但我要最后找。 我搜索了一下,发现没有最后一个,但有第一个C++ 查找std::vector中满足条件的最后一个元素,c++,c++11,vector,stl,stl-algorithm,C++,C++11,Vector,Stl,Stl Algorithm,我需要找到向量中小于某个值的最后一个元素 比如先找,但我要最后找。 我搜索了一下,发现没有最后一个,但有第一个 为什么会这样?标准方法是将find_first_of与反向迭代器一起使用吗 这是如何使用反向迭代器完成的: std::vector<int> vec = {2,3,10,5,7,11,3,6}; //below outputs '3': std::cout << *(std::find_if(vec.rbegin(), vec.rend(), [](int
为什么会这样?标准方法是将find_first_of与反向迭代器一起使用吗 这是如何使用反向迭代器完成的:
std::vector<int> vec = {2,3,10,5,7,11,3,6};
//below outputs '3':
std::cout << *(std::find_if(vec.rbegin(), vec.rend(), [](int i) { return i < 4; }));
std::vector vec={2,3,10,5,7,11,3,6};
//以下输出“3”:
std::cout使用,如下所示:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v{1,2,42,42,63};
auto result = std::find_if(v.rbegin(), v.rend(),
[](int i) { return i == 42; });
std::cout << std::distance(result, v.rend()) << '\n';
}
#包括
#包括
int main()
{
std::向量v{1,2,42,42,63};
自动结果=std::find_if(v.rbegin(),v.rend(),
[](int i){return i==42;});
std::cout只有一件事。如果要查找包含谓词元素的范围的末尾,请小心谓词:
int main()
{
std::vector<int> x { 0, 1, 2, 3, 4, 5 };
// finds the reverse iterator pointing at '2'
// but using base() to convert back to a forward iterator
// also 'advances' the resulting forward iterator.
// in effect, inverting the sense of the predicate to 'v >= 3'
auto iter = std::find_if(std::make_reverse_iterator(x.end()),
std::make_reverse_iterator(x.begin()),
[](auto& v) { return v < 3; }).base();
std::copy(iter,
x.end(),
std::ostream_iterator<int>(std::cout, ", "));
}
从ZenXml:
template <class BidirectionalIterator, class T> inline
BidirectionalIterator find_last(const BidirectionalIterator first, const
BidirectionalIterator last, const T& value)
{
for (BidirectionalIterator it = last; it != first;)
//reverse iteration: 1. check 2. decrement 3. evaluate
{
--it; //
if (*it == value)
return it;
}
return last;
}
模板内联
双向运算符find_last(常量双向运算符first,常量
双向运算符(最后一个,常数和值)
{
for(双向运算符it=last;it!=first;)
//反向迭代:1.检查2.减量3.评估
{
--它//
如果(*it==值)
归还它;
}
最后返回;
}
是的,使用反向迭代器。您可能希望在正常代码中解除限制之前检查结果。当然。以上仅用于说明目的。最后一行应该是std::cout@Akshay,这将导致一个负数,我需要到数组开头的距离。这不会编译。您无法比较迭代器和反向迭代器。t他链接的演示包含正确的代码。我在帖子中对齐了代码。
template <class BidirectionalIterator, class T> inline
BidirectionalIterator find_last(const BidirectionalIterator first, const
BidirectionalIterator last, const T& value)
{
for (BidirectionalIterator it = last; it != first;)
//reverse iteration: 1. check 2. decrement 3. evaluate
{
--it; //
if (*it == value)
return it;
}
return last;
}