我知道如何通过从向量迭代器中减去开始迭代器来获取索引。例如:
vector<int>::iterator it = find(vec.begin(), vec.end(), x);
size_t position = it - vec.begin();
但是,现在我想找到最后一个的索引x
在向量中。如何从反向迭代器中获取真正的索引?我发现以下内容似乎有效(编辑:它没有),但也许有更好的(更惯用的或其他......)方法。
vector<int>::reverse_iterator it = find(vec.rbegin(), vec.rend(), x);
size_t position = vec.size() - (it - vec.rbegin());
我会用:
#include <algorithm>
#include <iostream>
#include <vector>
int main()
{
auto v = std::vector<int> { 1, 2, 3 };
auto rit = std::find(v.rbegin(), v.rend(), 3);
if (rit != v.rend()) {
auto idx = std::distance(begin(v), rit.base()) - 1;
std::cout << idx;
} else
std::cout << "not found!";
}
实例 http://coliru.stacked-crooked.com/a/3cff456b9f485ea1.
原因是-1
距离计算中的问题是因为反向迭代器和正则迭代器之间的转换.base()
member:
24.5.1 反向迭代器 [reverse.iterators]
1 类模板reverse_iterator是迭代器适配器
从其底层迭代器定义的序列末尾到
该序列的开始。反向之间的基本关系
迭代器及其对应的迭代器 i 是由
身份:&*(reverse_iterator(i)) == &*(i - 1)
.
Note:您也可以使用上面的代码而不检查v.rend()
,并使用约定idx == -1
相当于没有找到的元素。然而,这失去了做事的能力v[idx]
,所以最终您还需要对此进行检查。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)