C++中STL迭代器如何使用

本文详细介绍了C++中迭代器的概念、定义与初始化,以及其在容器操作(如遍历、删除)中的应用,包括对自定义类型的支持。通过实例演示了如何使用迭代器进行元素访问、修改和查找。
摘要由CSDN通过智能技术生成

1.概念

迭代器是一种检查容器内元素并遍历元素的数据类型。 C++ 更趋向于使用迭代器而不是下标操作,因为标准库为每一种标准容器(如vector )定义了一种迭代器类型,而只用少数容器(如 vector )支持下标 操作访问容器元素。 C++中的迭代器是对指针的封装,迭代器提供特定的函数让调用者对指针进行特定的安全的操作。

2.定义和初始化

每种容器都定义了自己的迭代器类型,如 vector的迭代器  vector<int>::iterator iter;  //定义一个名为 iter 的迭代器变量。
每种容器都定义了一对名为 begin end 的函数,用于返回迭代器。
迭代器初始化操作:
vector<int> ivec;
// 将迭代器 iter1 初始化为指向 ivec 容器的第一个元素
vector<int>::iterator iter1=ivec.begin();
// 将迭代器 iter2 初始化为指向 ivec 容器的最后一个元素的下一个位置
vector<int>::iterator iter2=ivec.end();
注意:
       end 并不指向容器的任何元素, 而是指向容器的最后元素的下一位置,称为超出末端迭代器。 如果vector 为空,则 begin 返回的迭代器和 end 返回的迭代器相同。 一旦向上面这样定义和初始化,就相当于把该迭代器和容器进行了某种关联,就像把一个指针初始化为指向某一空间地址一样。

 示例:使用迭代器输出容器中的元素

vector<int>::iterator iter;
//for(int i = 0; i< 10; i++)
//begin是容器的头元素 ,end并不是尾元素,而是无效的元素表示容器结束
for(iter = v.begin(); iter != v.end(); iter++)
{
    cout<<*iter<<" ";
}
cout<<endl;

3.常用操作 

*iter // iter 进行解引用,返回迭代器 iter 指向的元素的引用
iter->men // iter 进行解引用,获取指定元素中名为 men 的成员。等效于 (*iter).men
++iter // iter 1 ,使其指向容器的下一个元素
--iter // iter 1 ,使其指向容器的前一个元素
iter1==iter2 // 比较两个迭代器是否相等,当它们指向同一个容器的同一个元素时相等
示例: 100 以内能整除 2 的数都更改为 0, 输出最后的结果
int main()
{
    //2.创建容器 原理:数组原理 连续 [角标]
    vector<int> v;//默认方式初始化底层没有为其分配内存空间
    for(int i=0;i<100;i++)
        v.push_back(i);
    //迭代器遍历
    //begin是容器的头元素 ,end并不是尾元素,而是无效的元素表示容器结束
    vector<int>::iterator iter;
    for(iter=v.begin(); iter != v.end(); iter++)
    {
        if(*iter%2==0)
            cout<<*iter<<" ";
    }
    cout<<endl;
    return 0;
}

4.迭代器遍历删除

示例:删除方法 v.erase(iter);
v.erase(pos); // 移除 pos 位置上的元素,返回下一个数据的位置
v.erase(begin, end); // 移除 [begin, end) 区间的数据,返回下一个元素的位置
注意:迭代器所指向的对象被删除后,迭代器就无效了, erase函数会返回一个新的迭代器,指向删除元素的下一个元素。
练习 1 :容器中保存数据 0~9,10,10 ,将其中的偶数删除
int main()
{
    //2.创建容器 原理:数组原理 连续 [角标]
    vector<int> v;//默认方式初始化底层没有为其分配内存空间
    for(int i=0;i<10;i++)
    v.push_back(i);//0~9 10 10
    v.push_back(10);
    v.push_back(10);
    //迭代器遍历 删除偶数
    //begin是容器的头元素 ,end并不是尾元素,而是无效的元素表示容器结束
    vector<int>::iterator iter;
    for(iter=v.begin(); iter != v.end(); )
    {
        if(*iter%2 == 0)
        {
            //迭代器所指向的对象被删除后,迭代器就无效了,
            //erase函数会返回一个新的迭代器,指向删除元素的下一个元素
            iter = v.erase(iter);//已经指向最后一个
        }else
            iter++;
    }
    for(int i=0;i<v.size();i++)
        cout<<v[i]<<endl;
}

5.查找迭代器删除

1 )加入头文件 #include <algorithm>
2 )查找方法为: vector<int>::iterator iter = find(v.begin(), v.end(), 3);
3 )注意: find 方法只能删除找到的第一个元素
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    vector<int> v;
    for(int i = 0;i < 10;i++)
    {
        v.push_back(i);
    }
    vector<int>::iterator iter = find(v.begin(), v.end(), 3);
    v.erase(iter);
    for(vector<int>::iterator iter = v.begin();iter != v.end();iter++)
    {
        cout<<*iter<<endl;
    }
    return 0;
}

6.容器添加自定义类型

#include <iostream>
#include <vector>
#include <algorithm>//算法头文件
using namespace std;
class Person
{
    int age;
public:
    Person(int age):age(age){}
    void show(){cout<<age<<endl;}
    };
int main()
{
    //自定义类型的容器
    vector<Person> v;
    //添加元素:3种方式
    Person p(1);
    //1.将对象装进容器
    v.push_back(p);
    Person p1(2);
    v.push_back(p1);
    //2.将匿名对象装进容器
    v.push_back(Person(3));
    //3.利用隐士转换方式 将对象装进容器
    v.push_back(4);
    for(int i=0 ; i< v.size(); i++)
        v[i].show();//v[i]-->pesron对象
    //迭代器遍历 调用show方法
    vector<Person>::iterator iter;
    for(iter=v.begin(); iter!=v.end(); iter++)
    {
        iter->show();//(*iter).show();
    }
    return 0;
}

7.查找迭代器删除自定义类型

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Person
{
    int age;
public:
    Person(int a):age(a){}
    void show(){cout<<age<<endl;}
    bool operator ==(const Person& other)
    {
        if(this->age == other.age)
            return true;
        else
            return false;
    }
};
int main()
{
    vector<Person> v;
    Person p(10);
    v.push_back(p);//Person(10)
    v.push_back(Person(20));
    v.push_back(Person(30));
    vector<Person>::iterator it = find(v.begin(),v.end(),Person(20));
    if(it != v.end())
    {
        it->show();
    }else
    cout<<"not"<<endl;
    for(vector<Person>::iterator iter = v.begin();iter != v.end(); iter++)
    {
        (*iter).show();//iter->show();
    }
}

 结语

以上就是迭代器基本使用方法,本次代码分享到此结束,后续还会分享有关C++知识。

最后的最后,还请大家点点赞,点点关注,谢谢大家!

  • 33
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值