找到std :: vector中的最后一个非零元素

时间:2017-03-01 15:03:47

标签: c++ c++11

我试图找到std::vector<double>中最后一个非零元素的索引。如果向量中的最后一个元素不为零,那么它应该返回最后一个元素的索引。

我相信我可以使用std::find_if_not反向迭代器和std::distance,基于此:

std::find_if_not(amounts.rbegin(), amounts.rend(), 0.0)

其中amountsstd::vector<double>,但我很难将其与std::distance和前向迭代器amounts.begin()结合使用。

另外,有没有一种方法可以引入谓词来比较,比如1e-8的容差?

我正在使用C ++ 11。

3 个答案:

答案 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期望的第三个参数(而不是元素的值)。