vector二维数组用法的简单示例

在完成CodeForce 234E的时候,想到可以用Vector来完成模拟,下面给出代码

#include<bits/stdc++.h>
using namespace std;
struct Team{
	char name[121];
	int score;
}  team[67];

bool cmp(Team A,Team B) { return A.score>B.score; }
vector<vector<Team> > vec;
vector<Team>  vtemp;
int x,a,b,c; 
int randm(int x)
{
	return (x*a+b)%c;
}
 
int main()
{
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
	
	int n,m;

	cin>>n; 
	cin>>x>>a>>b>>c;
	m=n/4; 
	memset(team,0,sizeof(team));
	
	for(int i=0;i<n;++i)
		cin>>team[i].name>>team[i].score;
	
	sort(team,team+n,cmp); 
	
	for(int i=0;i<4;i++)
	{
	  for(int j=0;j<m;j++)
		  vtemp.push_back(team[i*m+j]);
	  vec.push_back(vtemp);
	  vtemp.clear();
	}
	
	int temp=randm(x);
	
	for(int k=0;k<=m-1;++k)
	{
		cout<<"Group "<<(char)('A'+k)<<":"<<endl;
		for(int i=0;i<4;++i)
		{
			cout<<vec[i][temp%vec[i].size()].name<<endl;
			//cout<<"i="<<i<<"---"<<temp<<"---"<<vec[i].size()<<endl;
			vec[i].erase(vec[i].begin()+temp%vec[i].size());
			temp=randm(temp);	
		}
	}	
	return 0;
 } 

在完成这道题目的时候,遇到的问题有

  1. Vector 二维数组的初始化插入问题
  2. Vector 二维数组的查找删除操作

初始化

Vector 二维数组的初始化方式有以下几种

  1. 直接用初始化方法
vector<vector<int> > newOne(r, vector<int>(c, 0));
  1. 用resize()来控制大小
    vector<vector<int> > res;
        res.resize(r);//r行
        for (int k = 0; k < r; ++k){
            res[k].resize(c);//每行为c列
        }

因为后面的插入操作可以完成题目的要求,代码中不再展示


插入

在我的代码里如果使用vec[i].push_back(),在i>0的时候会出现数据在行尾的问题,故在这一题里面我使用了以下方法,如果有大神知道为什么请在评论区指出

for(int i=0;i<4;i++)
	{
	  for(int j=0;j<m;j++)				//
		  vtemp.push_back(team[i*m+j]);	// 在内层循环将第i行的内容push_back进vtenp数组中.
	  vec.push_back(vtemp);//再将vtemp 数组整体push_back进vec数组中
	  vtemp.clear();  //清空vtemp数组
	}

查找

Vector 没有内置find() 方法,故只能使用Algorithm自带的find()方法,具体使用样例如下

vector<int>::iterator it = find(vec.begin(), vec.end(), XXX);//XXX 为所需要查找的内容,使用时需要包含Algorithm头文件

删除

Vector 删除某个元素的方法有三种

  1. pop_back()
vecInt.pop_back();//删除最后一个元素
  1. erase()
 vector<int>::iterator k = vecInt.begin();

   vecInt.erase(k);//删除第一个元素

   //vecInt.erase(k); //迭代器k已经失效,会出错

   cout<<"删除第一个元素后,vector contains "<<vecInt.size()<<" elements"<<endl;

   //vecInt.erase(vecInt.begin(),vecInt.end()); //删除所有元素

注意,eraser()接收的值为迭代器类型,不能直接使用Vector下标来删除元素
3. remmove

    vector<int>::iterator vecNewEnd =remove(vecInt.begin(),vecInt.end(),5); //删除元素

remove()方法使用时一般不会改变容器的大小


参考博客:
Vector二维数组的插入:https://ask.csdn.net/questions/246763
Vector二维数组的构造:https://blog.csdn.net/sinat_36053757/article/details/71053706
Vector二维数组的实现:https://blog.csdn.net/a819825294/article/details/52088732
Vector二维数组的find()方法:https://blog.csdn.net/test1280/article/details/65937779
Vector二维数组的删除方法:https://blog.csdn.net/doctor_feng/article/details/11880787

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值