如何将 std::<list>::reverse_iterator 与运算符 + 一起使用?

how to use std::<list>::reverse_iterator with operator +?

本文关键字:运算符 一起 iterator gt std lt list reverse      更新时间:2023-10-16

我试过这个:

#include <iterator>
#include <list>
int main()
{
    std::list<int> list(200);
    std::list<int>::reverse_iterator it = list.rbegin() + 100;
}

在编译时,它抱怨道:

 error: no operator "-" matches these operands
            operand types are: const std::_List_iterator<int> - std::ptrdiff_t
        balabalabalabalabalabalabalabalabalabalabalabala...

我在std::vector上尝试了相同的代码,它运行得很好。我的问题是如何将std::<list>::reverse_iteratoroperator +结合使用?

std::list没有随机访问迭代器。这意味着你不能任意增加它们。您可以使用++运算符中的任意一个来增加它们:

std::list<int>::reverse_iterator it = list.rbegin()++;

std::list<int>::reverse_iterator it = ++(list.rbegin());

您也可以使用std::advancestd::next执行多个步骤,但在内部,这些步骤将逐个执行。遍历列表是一种O(N)运算。

例如,

std::list<int>::reverse_iterator it = std::next(list.rbegin(), 100);

std::list<int>::reverse_iterator it = list.rbegin();
std::advance(it, 100);

在这两种情况下,++都将被应用100次。因此,如果您需要经常这样做,那么使用std::vector而不是std::list可能会更好,因为这些运算对于向量是O(1)。事实上,您应该有充分的理由使用list而不是vector。这很少是一个好的选择。

std::list有一个双向迭代器。operator +不是为双向迭代器定义的。它仅为随机访问迭代器定义,例如std::vector的迭代器。对于双向迭代器,必须使用标准函数std::nextstd::prev,而对于迭代器所需的次数,则必须使用operator ++operator --

例如,你可以写

std::list<int>::reverse_iterator it = std::next( list.rbegin(), 100 );

只要该列表具有这样数量的元素。

函数std::nextstd::prev在标头<iterator> 中声明

一个替代函数是标准函数CCD_ 23。