![](/img/trans.png)
[英]“lvalue required as increment operand” about C++ & stl vector's 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
{akastd::_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.