迭代器
迭代器的概念
迭代器是一个用来遍历容器内元素的对象,它本身不拥有数据,而是通过指向容器内元素的方式,来访问容器内的元素。
迭代器提供了类似指针的运算符:* 、++ 、== 、!= 、 =
。这些操作和C/C++
指针的接口一致。
迭代器可以指向容器中的任意元素,它有指向容器中元素的指针。
迭代器的操作
获取不同容器的迭代器类型
模板类类型::iterator
获取容器中指向首个元素的迭代器
模板类对象.begin()
获取容器中指向末尾元素的迭代器
模板类对象.end()
示例代码
基本类型的迭代器
- 编写
main.cpp
,代码如下#include <iostream> #include <vector> using namespace std; void test01() { vector<int> arr; vector<int>::iterator it; int i = 0; for (i = 0; i < 10; ++i) { arr.push_back(i); } for (it = arr.begin(); it != arr.end(); ++it) { cout << *it << endl; } } int main(int argc, char *argv[]) { test01(); return 0; }
- 编译运行,结果如下
0 1 2 3 4 5 6 7 8 9
类类型的迭代器
- 声明学生类,编写
student.h
,代码如下学生类的声明,包含私有成员变量
_id
和_name
,公共方法getId()
,getName()
,introduce()
以及构造函数Student(const string& name, int id)
。#pragma once #ifndef _STUDENT_H #define _STUDENT_H #include <string> using namespace std; class Student { private: int _id; string _name; public: Student(const string& name, int id); int getId() const; string getName() const; void introduce() const; }; #endif // !_STUDENT_H
- 实现学生类,编写
student.cpp
,代码如下实现公共方法
#include "student.h" #include <iostream> using namespace std; Student::Student(const string& name, int id) :_name(name), _id(id) { } int Student::getId() const { return _id; } string Student::getName() const { return _name; } void Student::introduce() const { cout << "Hello!I'm " << _name << ",my id card is " << _id << endl; }
- 修改
main.cpp
,代码如下其中写了很多方法,列出方法使用说明
string rand_str(const int len)
随机获取len
长度的字符串,字符串内容为a-z
的随机组合。struct testCompare
结构体,包含operator()
方法,用于比较Student
类对象,配合sort方法使用。void test02()
测试Student
类对象迭代器。
#include <iostream> #include <vector> #include <algorithm> #include <string.h> #include "student.h" using namespace std; string rand_str(const int len) { string str; char c; int idx; for (idx = 0; idx < len; idx++) { c = 'a' + rand() % 26; // rand()%26是取余,余数为0~25加上'a',就是字母a~z,详见asc码表 str.push_back(c); } return str; } struct testCompare { bool operator() (Student stu1, Student stu2) { const int len1 = stu1.getName().length(); const int len2 = stu2.getName().length(); if (len1 > len2) { return true; } if (len1 < len2) { return false; } else { return (stu1.getId() < stu2.getId()); } } }testCompareObj; void test02() { vector<Student> arr; vector<Student>::iterator it; int i = 0; for (i = 0; i < 10; ++i) { const int len = rand() % 6 + 4; const string name = rand_str(len); Student stu(name, i); arr.push_back(stu); } for (it = arr.begin(); it != arr.end(); ++it) { it->introduce(); } sort(arr.begin(), arr.end(), testCompareObj); cout << "重新排序后" << endl; for (it = arr.begin(); it != arr.end(); ++it) { it->introduce(); } } int main(int argc, char *argv[]) { test02(); return 0; }
- 编译运行代码
Hello!I'm hqghumeay,my id card is 0 Hello!I'm nlfdxfirc,my id card is 1 Hello!I'm scxggbw,my id card is 2 Hello!I'm fnqdux,my id card is 3 Hello!I'm fnfozvsr,my id card is 4 Hello!I'm kjprepg,my id card is 5 Hello!I'm xrpnrvys,my id card is 6 Hello!I'm mwcysyycq,my id card is 7 Hello!I'm evikeff,my id card is 8 Hello!I'm znimkk,my id card is 9 重新排序后 Hello!I'm hqghumeay,my id card is 0 Hello!I'm nlfdxfirc,my id card is 1 Hello!I'm mwcysyycq,my id card is 7 Hello!I'm fnfozvsr,my id card is 4 Hello!I'm xrpnrvys,my id card is 6 Hello!I'm scxggbw,my id card is 2 Hello!I'm kjprepg,my id card is 5 Hello!I'm evikeff,my id card is 8 Hello!I'm fnqdux,my id card is 3 Hello!I'm znimkk,my id card is 9
迭代器失效现象
因为容器存储数据在内存中的结构会随着数据的增删发生变化,所以当对容器进行增删操作时,迭代器可能会出现失效的情况。
例如某容器有5个元素,迭代器指向第5个元素时,删除容器某一个元素,此时第五个元素就不存在了,迭代器就失效了。
示例代码
- 编写
main.cpp
,代码如下#include <iostream> #include <vector> using namespace std; void test03() { vector<int> arr; vector<int>::iterator it; int i = 0; for (i = 0; i < 5; ++i) { arr.push_back(i); } it = arr.end() - 1; cout << "it:" << *it << endl; arr.pop_back(); cout << "it:" << *it << endl; } int main(int argc, char *argv[]) { test03(); return 0; }
- 编译运行,结果如下
如上所示,打印了id:4,随后删除容器最后一个元素,再次打印,发现迭代器失效了。it:4