为什么 it1++ 有效,但 it1=it1+1 无效,其中 it1 是列表容器的迭代器
Why `it1++` works, but `it1=it1+1` does not, where it1 is iterator of list container
给定一个名为 it
的 std::list
迭代器,it1++
等价于 it1=it1+1
。那么为什么 it1++
工作正常,但 it1=it1+1
在下面的代码中给出错误?
代码
#include <iostream>
#include <list>
int main()
{
std::list<int> l1{19, 2, 3, 21, 5, 19, 7, 11};
std::list<int>::iterator it1;
std::cout << "1st\n";
it1 = l1.begin();
it1++;
it1 = it1 + 1; // This giving error
}
输出
Invalid operands to binary expression
('std::list<int>::iterator' (aka '_List_iterator<int>') and 'int')
回复:“it1++
等同于 it1=it1+1
” -- 事实并非如此。对于内置数字类型来说确实如此,但是一旦重载运算符发挥作用,就没有内在联系在两个运算符之间。std::list
的迭代器是 forward 迭代器;它们没有 operator+
,但它们确实有 operator++
.
编辑、阐述:
A forward 迭代器让你按顺序向前移动。为此,它提供了 operator++
的两个重载,因此您可以编写 it++
和 ++it
。 std::forward_list
提供前向迭代器。
一个双向迭代器让你在一个序列中向前和向后移动。除了前向迭代器提供的操作外,它还提供了operator--
的两个重载,这样你就可以写成it--
和--it
。 std::list
提供双向迭代器。
一个随机访问迭代器让你移动到序列中的任意位置。除了双向迭代器提供的这种操作之外,它还提供了 operator+
的重载,以便您可以编写 it + 3
。它还提供了 operator[]
的重载,因此 it[n]
等同于 *(it + n)
。 std::vector
提供随机访问迭代器。
给定一个名为 it
的 std::list
迭代器,it1++
等价于 it1=it1+1
。那么为什么 it1++
工作正常,但 it1=it1+1
在下面的代码中给出错误?
代码
#include <iostream>
#include <list>
int main()
{
std::list<int> l1{19, 2, 3, 21, 5, 19, 7, 11};
std::list<int>::iterator it1;
std::cout << "1st\n";
it1 = l1.begin();
it1++;
it1 = it1 + 1; // This giving error
}
输出
Invalid operands to binary expression
('std::list<int>::iterator' (aka '_List_iterator<int>') and 'int')
回复:“it1++
等同于 it1=it1+1
” -- 事实并非如此。对于内置数字类型来说确实如此,但是一旦重载运算符发挥作用,就没有内在联系在两个运算符之间。std::list
的迭代器是 forward 迭代器;它们没有 operator+
,但它们确实有 operator++
.
编辑、阐述:
A forward 迭代器让你按顺序向前移动。为此,它提供了 operator++
的两个重载,因此您可以编写 it++
和 ++it
。 std::forward_list
提供前向迭代器。
一个双向迭代器让你在一个序列中向前和向后移动。除了前向迭代器提供的操作外,它还提供了operator--
的两个重载,这样你就可以写成it--
和--it
。 std::list
提供双向迭代器。
一个随机访问迭代器让你移动到序列中的任意位置。除了双向迭代器提供的这种操作之外,它还提供了 operator+
的重载,以便您可以编写 it + 3
。它还提供了 operator[]
的重载,因此 it[n]
等同于 *(it + n)
。 std::vector
提供随机访问迭代器。