vector set map 复盘
依旧是熟悉的概念补充
//迭代器
//一般格式:
容器类名<元素类型>::iterator 变量名
作用:类似与指针,可用*访问
访问方式:
//用迭代器访问
vector<int>::iterator it;
for(it=myvector.begin();it!=myvector.end();it++)
{
cout<<*it<<" ";
}
//操作性访问
while(!myvector.empty())
{
//cout<<myvector.back()<<" ";末尾元
cout<<myvector.back();
myvector.pop_back();
}
//下标访问 一般都支持
vector
一般输入
int i,j,k;
int n;
cin>>n;
for(i=0;i<n;i++)
{
int temp;
cin>>temp;
myvector.push_back(temp);
}
访问
vector<int>::iterator it;
while(!myvector.empty())//非空队尾访问
{
//cout<<myvector.back()<<" ";末尾元素
cout<<myvector.back();
myvector.pop_back();
}
存储结构体数组,依葫芦画瓢
typedef struct student
{
string name;
int score;
}student;
student arry[100];
vector<student>myvector;
int n;
cout<<"请输入组数"<<endl;
cin>>n;
for(int i=0;i<n;i++)
{
cout<<"请输入学生姓名"<<endl;
cin>>arry[i].name;
cout<<"请输入学生成绩"<<endl;
cin>>arry[i].score;
myvector.push_back(arry[i]);
}
支持分配数组长度与初始化默认值 (不需要fill)
如:
vector<int> a(100,2);//100个int数据空间 初始值为2
二维vector数组,这里一开始踩了很多坑
vector<vector<int>>sc;
vector<vector<int>>sc;
int i,j,k;
for(i=0;i<sc.size();i++)
{
for(j=0;j<sc[i].size();j++)
{
cout<<sc[i][j]<<" ";
}
cout<<endl;
}
for(i=0;i<10;i++)//一开始这里i给少了 后面直接访问出错不能输出 越界居然脸输出都没有
{
sc.push_back(vector<int>());
//初始化二维数组为空
//此时打印会用有空格
}
//cout<<sc.size()<<" "<<sc[1].size()<<endl;
//此时每一列仍为空
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
//sc[i][j]=i+j;赋值是没用的!!还没有空间
int t=i+j;
//cout<<t<<" ";
//sc[i][j].push_back(t);//单个元素不能再塞值
sc[i].push_back(t);
cout<<sc[i].back()<<"末尾值查看"<<endl;
//cout<<sc[i][j]<<"数组值查看"<<endl;//没问题
}
}
cout<<"进入"<<endl;
/* ************************ */
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
cout<<sc[i][j]<<"成功"<<"\t";
}
cout<<endl;
}
set(集合) 一些列操作时间复杂度都是 log n
特性 :对置入元素自动升序排序
下面都是insert插入
注意这里的.end()是最后一个元素的下一个元素的迭代器
set<int> myset;
int n;
cout<<"请输入元素数量"<<endl;
cin>>n;
int i,j,k;
for(i=0;i<n;i++)
{
int t;
cin>>t;
myset.insert(t);
}
set<int>::iterator it;
//默认升序排列
//可++ 可-- 排列
for(it=myset.begin();it!=myset.end();it++)
{
cout<<*it<<" ";
}
下面是基本操作演示
.insert()
.earse ()
.clear()
.count()
这些这个的时候发现 如果在case(不写花括号)下定义变量会报错!!!
set<string>myset;
int n;
cout<<"请输入参赛国家数量"<<endl;
cin>>n;
int i,j,k;
for(i=0; i<n; i++)
{
cout<<"请输入参赛国家"<<i+1<<endl;
string temp;
cin>>temp;
myset.insert(temp);
}
set<string>::iterator it;
for(it=myset.begin(); it!=myset.end(); it++)
{
cout<<*it<<" ";
}
cout<<"请输入操作:"<<endl;
cout<<"1.插入\n2.删除\n3.查看"<<endl;
int choice;
int T=2;
cout<<"给你两次操作机会"<<endl;
while(T--)
{
cin>>choice;
switch(choice)
{
//case下面不加花括号 定义变量会报错
case 1:
{
//插入 插入重复元素不会有任何效果
string temp;
cout<<"请输入插入字符串!!\n";
cin>>temp;
myset.insert(temp);
break;
}
case 2:
{
//删除 删除不存在元素 不会有任何效果
string temp;
cout<<"请输入删除字符串"<<endl;
myset.erase(temp);
cout<<"删除成功"<<endl;
break;
}
case 3:
{
//查看
string temp;
cout<<"请输入查找元素:"<<endl;
cin>>temp;
if(myset.count(temp))
cout<<"元素存在"<<endl;
else
cout<<"元素不存在"<<endl;
break;
}
default:
T=0;
cout<<"结束"<<endl;
break;
}
}
myset.clear();
//判断成功
if(!myset.empty())
cout<<"数组存在"<<endl;
else
cout<<"数组不存在"<<endl;
很奇怪,在定义二维set的时候报错了
暂时跳过吧
map(键,值)
可以用 pair访问键,值 在头文件#include<utility>里面
但是map是一种特殊的,可以以任意类型数据为下标的特殊数组
所以直接用下标索引就好了
自动按键的字典序由小到大排序 可以用来统计字符串出现次数
注意访问键first 和值second时要用->访问 不是.
map<string,int> mymap;
int n;
cout<<"请输入组数"<<endl;
cin>>n;
for(int i=0;i<n;i++)
{
string temp;
cin>>temp;
mymap[temp]++;
}
map<string,int>::iterator it;
for(it=mymap.begin();it!=mymap.end();it++)
{
//cout<<*it<<" ";
//map 有键与值 不能这样访问
cout<<it->first<<" "<<it->second<<" ";
}
二维map
map<int ,map<string,int> > mymap;
int n;
cout<<"请输入操作组数"<<endl;
cin>>n;
for(int i=0;i<n;i++)
{
int hang;
string temp;
cin>>hang>>temp;
mymap[hang][temp]++;
}
map<int ,map<string,int> >::iterator it1 ;
map<string,int>::iterator it2;
for(it1=mymap.begin();it1!=mymap.end();it1++)
{
//for(it2=it1.second.begin();it2!=it1.second.end();it2++)
for(it2=it1->second.begin();it2!=it1->second.end();it2++)
{
cout<<it2->first<<" "<<it2->second<<" ";
}
cout<<endl;
}
分别将每一行数据排序
注意定义迭代器时指向行的是二维map迭代器
指向列的是一维map迭代器