我试图找到std::vector<double>
中最后一个非零元素的索引。如果向量中的最后一个元素不为零,那么它应该返回最后一个元素的索引。
我相信我可以使用std::find_if_not
,反向迭代器和std::distance
,基于此:
std::find_if_not(amounts.rbegin(), amounts.rend(), 0.0)
其中amounts
是std::vector<double>
,但我很难将其与std::distance
和前向迭代器amounts.begin()
结合使用。
另外,有没有一种方法可以引入谓词来比较,比如1e-8的容差?
我正在使用C ++ 11。
答案 0 :(得分:7)
示例:
std::vector<double> v{1.32, 1.423, 2.543, 3.534, 4.2, 0};
auto result1 = std::find_if(std::rbegin(v), std::rend(v), [](auto& v) { return std::fabs(v - 0) > std::numeric_limits<double>::epsilon(); } );
if (result1 != std::rend(v)) {
std::cout << *result1 << "\n";
std::cout << std::distance(std::begin(v), (result1 + 1).base());
}
输出:
4.2
4
[编辑]
更多解释:
std::fabs(v - 0) > std::numeric_limits<double>::epsilon(); }
OP问题中有:
另外,有没有一种方法可以引入谓词来比较,比如1e-8的容差?
所以这是容差检查,您可以将epsilon
替换为其他值。
答案 1 :(得分:0)
一个简单的for
循环也可以做到这一点,请参阅实时样本:http://ideone.com/dVNOKk
#include <iostream>
#include <vector>
int main() {
std::vector<int> v{1, 2, 3, 4, 1, 2, 3, 0, 4, 1, 2, 3, 4, 0, 0, 0};
for (int i = static_cast<int>(v.size()) - 1; i >= 0; --i) {
if (v.at(i) != 0) {
std::cout << "Last non-zero at: " << i << '\n';
break;
}
}
return 0;
}
输出:Last non-zero at: 12
答案 2 :(得分:0)
但我很难将它与std :: distance和前向迭代器amount.begin()
结合使用
反向迭代器具有成员函数base
,它返回具有关系&*(rit.base() - 1) == &*rit
的非反向迭代器。因此,您可以使用以下内容:
std::distance(amounts.begin(), found.base()) - 1;
另一种选择:
amounts.size() - std::distance(amounts.rbegin(), found) - 1
另外,有没有一种方法可以引入谓词来比较,比如1e-8的容差?
是。实际上,您必须使用谓词,即使是精确的比较,因为这是std::find_if_not
期望的第三个参数(而不是元素的值)。