STL---迭代器

上期回顾/这期的大饼

        上期我们学了vector其余的函数的用法(上期链接

        这期我们将学习迭代器

什么是迭代器

        迭代器(iterator):

                用来指向、遍历、修改容器元素的变量,类似指针。

        

操作效果
*返回当前位置上的元素值。如果该元素有成员,可以通过迭代器以operator->取用
++将迭代器前进至下一元素
==和!=判断两个迭代器是否指向同一位置
=为迭代器赋值(将所指元素的位置赋值过去)
        迭代器(iterator)函数
操作效果
begin()返回一个迭代器,指向第一个元素
end()返回一个迭代器,指向最后一个元素之后

常用的迭代器 

        常用的迭代器按功能强弱分为:输入、输出、正向、双向、随机访问五种,这里只介绍常用的三种。

        1.正向迭代器

  • 假设p是一个正向迭代器,则p支持以下操作:++p,p++,*p。
  • 此外,两个正向迭代器可以互相赋值,还可以用==和!=运算进行比较。        

         2.双向迭代器

  • 双向迭代器具有正向迭代器的全部功能。
  • 双向迭代器p支持--p和p--,使得p朝和++p相反的方向移动。

        3.随机访问器 

  • 随机访问迭代器具有双向迭代器的全部功能。
  • 随机访问迭代器还支持以下操作:

                p+=i:使得p往后移动i个元素。

                p-=i:使得p往前移动i个元素。

                p+i:返回p后面第i个元素的迭代器。

                p-i:返回p前面第i个元素的迭代器。

                p[i]:返回p后面第i个元素的引用。

                两个随机访问迭代器p1、p2还可以用<、>、<=、>=运算符进行比较。

                表达式p2-p1表示迭代器p2所指向元素和迭代器p1所指向的元素的序号差。

不同容器迭代器的类别
容器迭代器类别
vector

随机

deque随机
list双向
set/multiset双向
map/multimap双向
stack不支持迭代器
queue不支持迭代器
priority_queue不支持迭代器

定义迭代器

        

    vector<int>::iterator 名称 ;//对于vector的迭代器
使用案例1
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a[]={10,20,30,40,50};
	vector<int> n(a,a+5);
	
	vector<int>::iterator it;
	it=n.begin();
	cout<<*it;
	return 0;
} 

输出结果

10

因为我们的迭代器指向的是n的第一个数值,所以我们输出的是10。

如果

(*it)++;

的结果是什么呢?

想一下吧

输出结果

 11

 因为我们的迭代器指向的是n的第一个数值,我们将他+1后,所以我们输出的是11。

使用案例2

利用for循环遍历

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a[]={10,20,30,40,50};
	vector<int> n(a,a+5);
	
	vector<int>::iterator it;
	for(it=n.begin();it<n.end();it++)
	{
		cout<<*it<<" ";
	}
	
	return 0;
} 

输出结果

10 20 30 40 50

小试牛刀

题目1

测试案例

输入

3 5
1 3
1 2
1 1
2 1
3 1

输出

3 1 2 3
1 1
1 1

想一下吧

想一下吧

想一下吧

 

 

代码样例

#include<bits/stdc++.h>
using namespace std;
vector<int> a[100100];
int n,m,x,y;
int main()
{
	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		cin>>x>>y;
		a[x-1].push_back(y);
	}
	for(int i=0;i<n;i++)
	{
		cout<<a[i].size();
		sort(a[i].begin(),a[i].end());
		for(int j=0;j<a[i].size();j++)
		{
			cout<<" "<<a[i][j];
		}
		cout<<endl;
	}
	return 0;
}
题目2

测试样例 

输入

4
1 3
1 1
2 2 1
3 2 3 1

输出

1
1 2
1 2 3
3

想一下吧

想一下吧

想一下吧

 

代码样例

#include<bits/stdc++.h>
using namespace std;
vector<int> a[1100];
int n,c,x;
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>c;
		for(int j=0;j<c;j++)
		{
			cin>>x;
			a[i].push_back(x);
		}
		sort(a[i].begin(),a[i].end());
	}
	sort(a,a+n);
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<a[i].size();j++)
		{
			cout<<a[i][j]<<' '; 
		}
		cout<<endl;
	}
	return 0;
} 

题目3

测试样例 

输入

8 3

输出

7

想一下吧

想一下吧

想一下吧

 

 代码样例

#include<bits/stdc++.h>
using namespace std;
vector<int> v;
int n,m; 
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		v.push_back(i);
	}
	int c=-1;
	while(v.size()!=1)
	{
		c=(c+m)%v.size();
		v.erase(v.begin()+c);
		c--;
	}
	cout<<v[0]<<endl;
	return 0;
}

  • 27
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值