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

Find the last non-zero element in a std::vector

本文关键字:最后一个 元素 std vector      更新时间:2023-10-16

我正在尝试在 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。

示例:

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用其他值替换。

简单的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

但是,我很难将其与std ::距离和前进迭代量相结合。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所期望的第三个参数(而不是元素的值)。