如何使用std :: <list> :: reverse_iterator与operator +?</list>

时间:2014-10-11 09:01:03

标签: c++ c++11 stl

我试过了:

#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 +一起使用?

2 个答案:

答案 0 :(得分:4)

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。这很少是一个不错的选择。

答案 1 :(得分:2)

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>

中声明

替代函数是标准函数std::advance