在std :: vector中找到最后一个非零元素
Find the last non-zero element in a std::vector
我正在尝试在 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。
示例:
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
所期望的第三个参数(而不是元素的值)。
相关文章:
- lower_bound()返回最后一个元素
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 仅显示链表的最后一个元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- std::矢量保存 只推送最后一个元素
- 反转后不返回最后一个元素
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 在 QListView 中显示最后一个元素
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 遍历列表包含排除最后一个元素的内容
- 如何打印第一个和最后一个元素的和,然后打印第二个和倒数第二个元素的总和,依此类推
- C++链表最后一个元素的迭代器?
- 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?
- 使用 STL 交换堆栈 C++ 中的第一个和最后一个元素
- 数组:如何在指定索引之前显示数组的第一个和最后一个元素以及数组元素的差异?
- 你能pop_back一个向量,并且仍然使用迭代器到最后一个元素吗?
- 如何使用第一个、中间和最后一个元素的中位数正确分区?