繁体   English   中英

c + + stl中(列表的)增量begin()不起作用

[英]increment begin() (of a list) in c++ stl doesn't work

我有这个代码

list<int> p {5,3,6,2,1};
vector<int> v {2,3,4};
cout<<*(v.begin() + 1);
cout<<*(p.begin() +1);

我得到第三行的输出为3,但第四行显示此错误

' operator+ '不匹配(操作数类型为' std::list<int>::iterator {aka std::_List_iterator<int> }'和' int ')

这是怎么了..为什么增量不能与列表指针一起使用..?

迭代器有不同的形式,有些比其他的更通用。

vector迭代器称为RandomAccess,这是最通用的类​​型。

list迭代器是双向的。 这意味着它们可以以1为步长向前或向后移动,但是您不能使用+-一次执行多个移动。

有一个标准函数std::next ,它将在迭代器上执行多次移动:

cout << * std::next(p.begin(), 1);

这样做的原因是通常情况下, list每个条目都位于其自己的内存中,并带有指向列表的下一个条目的指针。 因此,实现多个步骤跳转的唯一方法实际上是执行多个大小为一的步骤。

从理论上讲,即使对于双向迭代器,它们也可以使operator +转换为std::next ,但事实并非如此。

正如TC所建议的那样,可能的理由是随机访问迭代器上的+是O(1)操作,而双向迭代器上的std::next是O(n)操作,他们想保留un -重载+已经是恒定时间操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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