[英]Get index in vector from reverse iterator
我知道如何从向量迭代器中获取索引,方法是从中减去开始迭代器。 例如:
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!";
}
现场示例。
距离计算中-1
的原因是因为.base()
成员中的反向迭代器和常规迭代器之间的转换:
24.5.1 反向迭代器 [reverse.iterators]
1 类模板 reverse_iterator 是一个迭代器适配器,它从其底层迭代器定义的序列的末尾迭代到该序列的开头。 反向迭代器与其对应的迭代器 i 之间的基本关系由以下标识建立:
&*(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)
有关反向迭代器的更多信息。 如何在不混淆的情况下使用反向迭代器。 将反向迭代器转换为正向迭代器等等。
我会更改 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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.