我试过了:
#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_iterator
与operator +
一起使用?
答案 0 :(得分:4)
std::list
没有随机访问迭代器。这意味着您不能以任意数量递增它们。您可以做的是使用++
运算符增加它们:
std::list<int>::reverse_iterator it = list.rbegin()++;
或
std::list<int>::reverse_iterator it = ++(list.rbegin());
您也可以使用std::advance
或std::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::next
和std::prev
,而迭代器则使用operator ++
或operator --
作为迭代器所需的次数。
例如你可以写
std::list<int>::reverse_iterator it = std::next( list.rbegin(), 100 );
如果该列表包含如此多的元素。
函数std::next
和std::prev
在标头<iterator>
替代函数是标准函数std::advance
。