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++知识。
最后的最后,还请大家点点赞,点点关注,谢谢大家!