页面加载中 . . .

C++迭代器


本篇文章脑图地址

迭代器

迭代器的概念

迭代器是一个用来遍历容器内元素的对象,它本身不拥有数据,而是通过指向容器内元素的方式,来访问容器内的元素。
  迭代器提供了类似指针的运算符: * 、++ 、== 、!= 、 = 。这些操作和C/C++指针的接口一致。
  迭代器可以指向容器中的任意元素,它有指向容器中元素的指针。

迭代器的操作

获取不同容器的迭代器类型

模板类类型::iterator

获取容器中指向首个元素的迭代器

模板类对象.begin()

获取容器中指向末尾元素的迭代器

模板类对象.end()

示例代码

基本类型的迭代器

  1. 编写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;
    }
  2. 编译运行,结果如下
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

类类型的迭代器

  1. 声明学生类,编写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
  2. 实现学生类,编写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;
    }
  3. 修改main.cpp,代码如下

    其中写了很多方法,列出方法使用说明

    1. string rand_str(const int len) 随机获取len长度的字符串,字符串内容为a-z的随机组合。
    2. struct testCompare 结构体,包含operator()方法,用于比较Student类对象,配合sort方法使用。
    3. 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;
    }
  4. 编译运行代码
    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个元素时,删除容器某一个元素,此时第五个元素就不存在了,迭代器就失效了。

示例代码

  1. 编写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;
    }
  2. 编译运行,结果如下
    it:4
    
    如上所示,打印了id:4,随后删除容器最后一个元素,再次打印,发现迭代器失效了。

文章作者: ZhiQ
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZhiQ !
  目录