繁体   English   中英

从反向迭代器获取向量中的索引

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM