迭代器精彩演绎、失效分析及弥补、实战

本文深入探讨迭代器的概念、类型、操作及失效分析,包括begin/end、rbegin/rend、运算符、constiterator和cbegin/cend的使用,通过实战代码解析迭代器在容器遍历、内存管理和字符串处理中的应用。
摘要由CSDN通过智能技术生成

迭代器精彩演绎、失效分析及弥补、实战

代码解析

#include <iostream>
#include <vector>

/*
迭代器精彩演绎、失效分析及弥补、实战
(1)迭代器简介
(2)容器的迭代器类型
(3)迭代器begin()/end()操作,反向迭代器rbegin()/rend()操作
(4)迭代器运算符
(5)const iterator迭代器
    (5.1)cbegin()和cend()操作
(6)迭代器失效
    (6.1)灾难程序演示1
    (6.2)灾难程序演示2
(7)范例演示
    (7.1)用迭代器遍历一下string类型的数据
    (7.2)vector容器常用操作与内存释放

*/
using namespace std;

struct student{
    int num;
};

int main()
{
//    (1)迭代器简介:迭代器是一种遍历容器内元素的数据类型,感觉有点像指针,迭代器用来指向容器内的某个元素
//   vector
//    很少用[]的方式访问元素,更常用的方式是使用迭代器
//    通过迭代器,我们可以读容器内的元素值,读string中的每个字符,还可以修改迭代器所指向的元素
//    ++,--运算
//    list,map尽量使用迭代器访问容器中的元素

//    (2)容器的迭代器类型:
    vector<int> iv = {100,200,300};
    vector<int>::iterator iter; //定义迭代器,也必须是vector<int>

//    vector<int>::iterator理解成一个类型,这种类型就专门应用于迭代器
//    当我们用这个类型定义一个变量的时候,这个变量就是一个迭代器,这里iter这个变量就是个迭代器


//    (3)迭代器begin()/end()操作,反向迭代器rbegin()/rend()操作
//    begin()/end()返回迭代类型,(理解成返回一个迭代器)

    iter = iv.begin();//如果容器中有元素,则begin返回的迭代器,指向的是容器中的第一个元素
//    相当于iter指向了iv[0]
//    end()也是一样的,末尾段元素的后边,不存在的元素
    iter = iv.end();

//    if size == 0 则begin和end指向的内容相同
    vector<int> iv2;
    vector<int>::iterator iterbegin = iv2.begin();
    vector<int>::iterator iterend = iv2.end();
    if(iterbegin == iterend){
        cout << "iv2 is empty" << endl;
    }
    vector<int> iv3 = {100,200,300}; //定义一个容器
    for(vector<int>::iterator iter = iv3.begin();iter != iv3.end();iter++){
        cout << *iter << endl;
    }
//    反向迭代器: rbegin指向反向迭代器第一个元素
    vector<int> iv4 = {100,200,300}; //定义一个容器
    for(vector<int>::reverse_iterator iter4 = iv4.rbegin();iter4 != iv4.rend();iter4++){
        cout << *iter4 << endl;
    }
//    (4)迭代器运算符:*iter指向元素的引用,必须保证是有效的元素
//    不能指向end(),因为end()是末端元素的后边,也就是end()指向的是一个不存在的元素
//    iter5 = iv4.end();
//    cout << *iter5 << endl;

//    ++iter,--iter.前/后一个元素移动,指向头了可以--,指向尾了可以++(有的编译器不能这么操作)
    vector<int>::iterator iter6 = iv4.end();
    iter6++;
    vector<int>::iterator iter7 = iv4.begin();
    iter7--;
    iter7--;

//    比较 == !=

//    结构体容器
    vector<student> sv;
    student mystu;
    mystu.num = 111;

    sv.push_back(mystu);

    vector<student>::iterator iter8;
    iter8 = sv.begin();
    cout << (*iter8).num << endl;
    cout << iter8->num << endl;

//    (5)const iterator迭代器:值不能改变
//    迭代器指向的元素不能改变
//    只能读不能写
    vector<int>::const_iterator iter9;
    for(iter9 = iv4.begin();iter9 != iv4.end();iter9++){
//        *iter9 = 10; //报错
        cout << *iter9 << endl;//正常读
    }
//    (5.1)cbegin()和cend()操作:C++11引入的新特性:返回的都是常量迭代器
    for(auto iter10 = iv4.cbegin();iter10 != iv4.cend();++iter10){
        cout << *iter10 << endl;
    }
//    (6)迭代器失效
    vector<int> iv5{1,2,3,4,5};
    for(auto vecitem:iv5){
//        iv5.push_back(8);
        cout << vecitem << endl;
    }
//    在操作迭代器容器过程中(迭代器循环体),千万不要改变容器 的容量,不要增加或减少vector容器中的元素
//    迭代器失效:程序直接奔溃
    for(auto beg = iv5.begin();beg != iv5.end();++beg){
//        iv5.push_back(656);
        cout << *beg << endl;
    }
    //        (6.1)灾难程序演示1
    vector<int> iv6{1,2,3,4,5};
    auto beg2 = iv6.begin();
    auto end2 = iv6.end();
    while(beg2 != end2)
    {
        cout << *beg2 << endl;
//        iv6.insert(beg2,80); //break就安全了
        ++beg2;
    }

//        (6.2)灾难程序演示2
//    for(auto iter = iv6.begin();iter != iv6.end();iter++){
//        iv6.erase(iter);
//    }

    while(!iv6.empty()){
        auto iter = iv6.begin();
        iv6.erase(iter);
    }
//    (7)范例演示
//        (7.1)用迭代器遍历一下string类型的数据
//        (7.2)vector容器常用操作与内存释放(存放对象的指针,依次释放容器里面的指针,最后释放对象)
    cout << "Hello World!" << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值