六一的部落格


关关难过关关过,前路漫漫亦灿灿。



用来访问容器中的元素

解引用容器迭代器时, 会得到元素类型对象

不用像C语言需要自行遍历list的next和prev指针, 执行迭代器运算即可

所有容器都支持迭代器:

  1. 关联容器支持迭代器
  2. 不确定顺序容器支持随机访问还是顺序访问时,使用迭代器

可以获取所有容器的首前/尾后迭代器; 可以获取所有容器的首迭代器; 可以获取除forward_list外容器的尾迭代器


容器对迭代器运算的支持


递增递减运算符

-
递增运算符 ++ 按给定方向, 指向下一个元素
递减运算符 -- 按给定方向, 指向上一个元素
  1. 顺序容器

    所有迭代器都定义了递增运算符,从当前元素移动到下一个元素

    forward_list不支持递减运算符

  2. 关联容器

    关联容器的迭代器都是双向的


访问容器中的元素

-
解引用运算符 * 获取元素的引用
成员访问运算符 -> 访问元素的数据成员

迭代器范围

iterator range

给出两个迭代器, 通常指示一个左闭右开区间 [begin, end)

forward_list删除给定迭代器范围包含元素时, 迭代器范围指示开区间 (begin, end)

end迭代器指向容器中的元素或者尾后元素

在给定方向, begin迭代器在end迭代器之前: 可以通过递增begin去到end


常用指示

-
begin == end 判断容器是否为空
begin != end 遍历元素时判断是否结束; 建议执行end操作
end - begin 容器大小
1while (begin != end)
2{
3    // process
4    ++begin;
5}

不是所有迭代器都定义了大于运算符, 小于运算符; 但所有迭代器都有定义不等运算符


反向迭代器

反向遍历容器元素的迭代器

获取迭代器: 使用begin和end操作获取指向首元素和尾后元素的迭代器

获取反向迭代器: 使用rbegin和rend操作获取指向尾元素和首前元素的反向迭代器

递增迭代器, 可以从首元素遍历到尾后元素; 递增反向迭代器, 可以用尾元素遍历到首前元素

forward_list不支持反向迭代器


获取迭代器

操作 常量版本: 指向元素的具有顶层const
begin 获取指向首元素的迭代器 cbegin
end 获取指向尾后元素的迭代器 cend
rbegin 获取指向尾元素的反向迭代器 crbegin
rend 获取指向首前元素的反向迭代器 crend
  1. 首前元素和尾后元素并不存在, 用来指示位置: 一个在首元素之前, 一个在尾元素之后
  2. 不需要对元素执行写操作时, 建议使用获取迭代器操作的常量版本
1// 获取迭代器
2
3auto beg = c.begin();          // 获取迭代器,指向首元素
4auto end = c.end();            // 获取迭代器,指向尾后元素
5
6auto cbeg = c.cbegin();
7auto cend = c.cend();
1// 获取反向迭代器. forward_list不支持
2
3auto rbeg = c.rbegin();    // 获取反向迭代器,指向尾元素
4auto rend = c.rend();      // 获取反向迭代器,指向首前元素
5
6auto crbeg = c.crbegin();
7auto crend = c.crend();
1list<string> a = {"Milton", "Shakespeare", "Austen"};
2
3list<string>::iterator it1 = a.begin();    // "Milton"
4
5list<string>::reverse_iterator it2 = a.rbegin();    // "Austen"
6
7list<string>::const_iterator it3 = a.cbegin();        // "Milton"
8
9list<string>::const_reverse_iterator it4 = a.crbegin();    // "Austen"

迭代器


用来访问容器中的元素

解引用容器迭代器时, 会得到元素类型对象

不用像C语言需要自行遍历list的next和prev指针, 执行迭代器运算即可

所有容器都支持迭代器:

  1. 关联容器支持迭代器
  2. 不确定顺序容器支持随机访问还是顺序访问时,使用迭代器

可以获取所有容器的首前/尾后迭代器; 可以获取所有容器的首迭代器; 可以获取除forward_list外容器的尾迭代器


容器对迭代器运算的支持


递增递减运算符

-
递增运算符 ++ 按给定方向, 指向下一个元素
递减运算符 -- 按给定方向, 指向上一个元素
  1. 顺序容器

    所有迭代器都定义了递增运算符,从当前元素移动到下一个元素

    forward_list不支持递减运算符

  2. 关联容器

    关联容器的迭代器都是双向的


访问容器中的元素

-
解引用运算符 * 获取元素的引用
成员访问运算符 -> 访问元素的数据成员

迭代器范围

iterator range

给出两个迭代器, 通常指示一个左闭右开区间 [begin, end)

forward_list删除给定迭代器范围包含元素时, 迭代器范围指示开区间 (begin, end)

end迭代器指向容器中的元素或者尾后元素

在给定方向, begin迭代器在end迭代器之前: 可以通过递增begin去到end


常用指示

-
begin == end 判断容器是否为空
begin != end 遍历元素时判断是否结束; 建议执行end操作
end - begin 容器大小
1while (begin != end)
2{
3    // process
4    ++begin;
5}

不是所有迭代器都定义了大于运算符, 小于运算符; 但所有迭代器都有定义不等运算符


反向迭代器

反向遍历容器元素的迭代器

获取迭代器: 使用begin和end操作获取指向首元素和尾后元素的迭代器

获取反向迭代器: 使用rbegin和rend操作获取指向尾元素和首前元素的反向迭代器

递增迭代器, 可以从首元素遍历到尾后元素; 递增反向迭代器, 可以用尾元素遍历到首前元素

forward_list不支持反向迭代器


获取迭代器

操作 常量版本: 指向元素的具有顶层const
begin 获取指向首元素的迭代器 cbegin
end 获取指向尾后元素的迭代器 cend
rbegin 获取指向尾元素的反向迭代器 crbegin
rend 获取指向首前元素的反向迭代器 crend
  1. 首前元素和尾后元素并不存在, 用来指示位置: 一个在首元素之前, 一个在尾元素之后
  2. 不需要对元素执行写操作时, 建议使用获取迭代器操作的常量版本
1// 获取迭代器
2
3auto beg = c.begin();          // 获取迭代器,指向首元素
4auto end = c.end();            // 获取迭代器,指向尾后元素
5
6auto cbeg = c.cbegin();
7auto cend = c.cend();
1// 获取反向迭代器. forward_list不支持
2
3auto rbeg = c.rbegin();    // 获取反向迭代器,指向尾元素
4auto rend = c.rend();      // 获取反向迭代器,指向首前元素
5
6auto crbeg = c.crbegin();
7auto crend = c.crend();
1list<string> a = {"Milton", "Shakespeare", "Austen"};
2
3list<string>::iterator it1 = a.begin();    // "Milton"
4
5list<string>::reverse_iterator it2 = a.rbegin();    // "Austen"
6
7list<string>::const_iterator it3 = a.cbegin();        // "Milton"
8
9list<string>::const_reverse_iterator it4 = a.crbegin();    // "Austen"