上期回顾/这期的大饼
上期我们学了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;
}