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 10v.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);//已经指向最后一个}elseiter++;}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;elsereturn 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();}elsecout<<"not"<<endl;for(vector<Person>::iterator iter = v.begin();iter != v.end(); iter++){(*iter).show();//iter->show();}
}
结语
以上就是迭代器基本使用方法,本次代码分享到此结束,后续还会分享有关C++知识。
最后的最后,还请大家点点赞,点点关注,谢谢大家!