Nei*_*irk 11 c++ iterator vector find reverse-iterator
我知道如何从向量迭代器中获取索引,方法是从中减去begin迭代器.例如:
vector<int>::iterator it = find(vec.begin(), vec.end(), x);
size_t position = it - vec.begin();
Run Code Online (Sandbox Code Playgroud)
但是,现在我想找到x
向量中最后一个的索引.如何从反向迭代器中获取实际索引?我发现以下似乎有效(编辑:它没有)但也许有更好的(更惯用或其他......)方式.
vector<int>::reverse_iterator it = find(vec.rbegin(), vec.rend(), x);
size_t position = vec.size() - (it - vec.rbegin());
Run Code Online (Sandbox Code Playgroud)
Tem*_*Rex 11
我会用:
#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!";
}
Run Code Online (Sandbox Code Playgroud)
实例.
-1
距离计算的原因是因为.base()
成员中反向和常规迭代器之间的转换:
24.5.1反向迭代器[reverse.iterators]
1类模板reverse_iterator是一个迭代器适配器,它从其底层迭代器定义的序列的末尾迭代到该序列的开头.反向迭代器与其对应的迭代器之间的基本关系由身份建立:
&*(reverse_iterator(i)) == &*(i - 1)
.
注意:您也可以在不检查的情况下使用上面的代码v.rend()
,并使用与idx == -1
未找到的元素等效的约定.然而,这失去了做的能力v[idx]
,所以最终你也需要对它进行检查.
你可以使用:
container.size() - 1 - (iterator - container.rbegin())
或者
container.size() - 1 - std::distance(container.rbegin(), iterator)
有关反向迭代器的更多信息。如何使用反向迭代器而不感到困惑。将反向迭代器转换为正向迭代器等等。