三、迭代器简介
1.迭代器的操作
vector<int>::iterator iter=ivec.begin();//非空则指向第一个元素,即vector[0]
iter=ivce.end();//指向最后一个元素的下一个,注意不是最后一个元素
当容器为空时 list.begin() = list.end()
迭代器自增运算++iter,,指向下一个元素
迭代器的解引用运算*iter,是一个左值
vector<string>::iterator iter // 就是定义一个迭代器变量
list.begin() // 表示容器的第一项迭代器,如果容器有值指向list[0]
list.end() // 表示容器的哨兵位,也就是最后一项后面的一项,只是用来表示迭代器已遍历到容器末端
iter++ // 迭代器自增表示向后移一位,指向下一个项
vector<string> list(10,"value");
for(vector<string>::iterator iter = list.begin(); iter != list.end(); iter++)
{
cout << *iter << endl; // 要访问迭代器当前值必须解引 *
*iter = "new value"; // 也可以解引后更改其值,可以看出解引是左值操作
}
// 如果想遍历容器又不想使用迭代器可以用下标操作
for(vector<string>::size_type ix = 0; ix != list.size(); ix)
{
cout << list[ix] << endl;
list[ix] = "new value";
}
2.const_iterator
常量迭代器,只能读容器里的元素,不能写.
注意与const 的iterator的区别
const_iterator,迭代器不是const,而是指向的对象是const,类似于指向常量的指针const int * p. p可以变,*p不能变
const iterator,迭代器是const,指向的对象是非const,类似于常量指针int * const p.
vector<string>::const_iterator iter // 定义一个代表常量的迭代器,和普通迭代器唯一不同的就是不能通过解引赋值
*iter = "new value"; // 这是不允许的,因为const_iterator告诉编译器我代表的是一个常量,所以不能通过任何手段改变其值
const vector<string>::iterator iter // 定义一个常迭代器,迭代器代表的变量,但迭代器本身是常量,所以可以更改代表的内容但无法更改迭代器
*iter = "new value"; // 没问题
iter ++ // 不允许,迭代器是常量所以无法让他指向其他项
const vector<string>::const_iterator iter // 这样定义的迭代器只能读取初始化指向的列表项内容,既无法向后移动迭代器也无法更改项值内容
3.迭代器的算术运算
迭代器不是每次只能向后移动一位,可以通过迭代器与一个整形字面值相加向后移动多位
iter + n // 迭代器向后移动n位并产生一个指向移位后新位置的迭代器
两个迭代器可以做相减运算结果是类型为difference_type的两个迭代器之间的距离(两个操作数一定要指向同一容器否则报错)
计算容器中中间的元素:
vector<int>::iterator mid=vi.begin()+vi.size()/2;//ok
vector<int>::iterator mid=(vi.begin()+vi.end())/2;//err