我知道如何从向量迭代器中获取索引,方法是从中减去begin迭代器。例如:
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());
答案 0 :(得分:9)
我会用:
#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!";
}
距离计算中-1
的原因是.base()
成员中反向和常规迭代器之间的转换:
24.5.1反向迭代器[reverse.iterators]
1类模板reverse_iterator是迭代的迭代器适配器 从它的底层迭代器定义的序列的末尾到 该序列的开头。反向之间的基本关系 迭代器及其相应的迭代器我是由 身份:
&*(reverse_iterator(i)) == &*(i - 1)
。
注意:您也可以在不检查v.rend()
的情况下使用上述代码,并使用idx == -1
等同于未找到元素的约定。但是,这会失去v[idx]
的能力,所以最终你也需要对它进行检查。
答案 1 :(得分:1)
您可以使用:
container.size() - 1 - (iterator - container.rbegin())
或
container.size() - 1 - std::distance(container.rbegin(), iterator)
有关反向迭代器的更多信息。 How To Use Reverse Iterators Without Getting Confused。将反向迭代器转换为前向迭代器等等。
答案 2 :(得分:0)
我将TemplateRex的答案更改为仅使用反向迭代器,从而避免了反向正向转换带来的麻烦。
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(rit, v.rend()) - 1;
std::cout << idx;
} else
std::cout << "not found!";
}
仍然需要-1
,因为向量的第一个元素(索引0)实际上位于v.rend() - 1
。