C++小细节13-迭代器

04/28/2020

  • 迭代器有个头文件叫iterator,通常嵌套在容器类中 。用于访问或者移动元素等。这个是容器的通用方法,因为大多数容器没有下标访问法。
  • 迭代器类似于指针类型,因为提供了对对象的间接访问,也有和像指针一样的移动操作,也分有效和无效。

声明与定义

//不同的容器类声明的类型是不同的
vector<int> vec;
std::vector<int>::iterator it = vec.begin();

set<int> s;
std::set<int>::iterator it2 = s.begin();

//方便可以使用auto自行推导
map<int,int> mapTable;
auto it3 = mapTable.begin();
auto it4 = mapTable.end();
if(it3 == it4)
{
	cout << "same";
}
  • 迭代器begin和end的范围:[begin,end)
  • 如果容器为空,begin和end返回的是同一个迭代器,都是尾后迭代器

容器类的成员

  • size_type:容器可以表示最大的元素。
  • iterator:可读可写
  • const_iterator: 以c开头的成员函数返回const_iterator,和指向常量的指针差不多,可读不可写。
  • difference_type
vector<int> a{1,2,3};
auto iter = a.begin(); //iterator
auto iter1 = a.cbegin();//const_iterator
iter1++;//正确
*iter1 = 33; //错误的

const vector<int> vec{1,2,3}; //常量vector会导致你无法加入新元素,也不能改变元素内容。
auto iter2 = vec.begin(); //const_iterator

迭代器运算

  • 加法向尾迭代器end走,减法向begin走去,都可能越界
  • 两个迭代器相减表示它们之间的距离
  • 关系元素符,迭代器的位置比较,迭代器在前面还是在后面。小于表示前者在后者之前。

容器操作可能使迭代器失效

增减删除可能会使指向容器元素的指针、引用或迭代器失效

  • 添加元素之后
    • 如果是vector和string, 扩容会造成3个全部失效。插入元素位置之前的3个不会,但是之后会。
    • 对于deque, 插入到除收尾元素之外的任何位置都会导致3个都会失效,如果是首位位置,迭代器会失效,但引用和指针不会。
    • 对于list,forward_list,3个仍有效
  • 删除
    • 和添加一样。

其他迭代器

  • 插入迭代器:绑定到容器上可以插入元素
  • 流迭代器:绑定到输入或输出,可用来遍历所关联的IO流
  • 反向迭代器: 从end到begin
  • 移动迭代器:不拷贝而是移动

插入器:不同元素位置插入的不同

  • back_inserter: 创建一个使用push_back的迭代器
  • front_inserter: push_front
  • inserter: insert

front_inserter的例子

#include <list>
#include <iterator>

//main
list<int> b;
auto iter = front_inserter(b);
*iter = 3;
*iter = 4;
*iter = 5;
for(auto x:b)
{
	cout << x << " ";
}

C++ primer 第五版 3.4
C++ primer 第五版 9.3.6
C++ primer 第五版 10.4

猜你喜欢

转载自blog.csdn.net/weixin_44200074/article/details/105792726