04/28/2020
C++迭代器
- 迭代器有个头文件叫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