现在的位置: 首页 > 综合 > 正文

C++ Primer学习笔记- 第三章:标准库类型之三

2019年11月20日 ⁄ 综合 ⁄ 共 1459字 ⁄ 字号 评论关闭

三、迭代器简介

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

抱歉!评论已关闭.