vector
简介
- vector是STL的动态数组,在运行时能改变数组大小,能存放任何类型的对象。
一、定义:
1.定义int型数组:
vector<int> a;
默认初始化,a为空。vector<int> b(a);
用a来定义b。vector<int> a(100);
有100个值为0的元素。vector<int> a(100,6);
有100个值为6的元素。
2.定义string型数组:
vector<string> a(10,"null");
有10个值为null的元素。vector<string> vec(10,"hello");
有10个值为hello的元素。
3.定义结构体型数组:
cpp struct point{int x,y;}; vector<point>a;
用a来储存坐标。
4.定义二维数组,及其相关操作:
- 定义一个二维数组:
vector<vector<int>> a;
- 将二维数组中的行数变成m:
a.resize(m);
- 将二维数组中的列数变成m:
for (int i = 1; i <= m; i++)
a[i].resize(n);
- 给二维数组赋值:
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
二、常用操作:
- 赋值(尾部插入):
a.push_back(100);
在尾部添加元素100。 - 元素个数:
a.size();
- 是否为空:
a.empty();
- 中间插入:
a.insert(a.begin() + i, k);
在第i个元素前面插入k。 - 尾部插入:
a.insert(a.end(), 10, 5);
在尾部插入10个值为5的元素。 - 删除尾部:
a.pop_back();
删除末尾元素。 - 删除区间:
a.erase(a.begin() + i, a.begin() + j);
删除区间[i,j-1]的元素。 - 删除元素:
a.erase(a.begin()+2);
删除第3个元素。 - 清空:
a.clear();
- 翻转:
reverse(a.begin(), a.end());
- 排序:
sort(a.begin(), a.end());
- 调整大小:
a.resize(n);
数组大小变为n;
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int n, m;
vector<int> table;
while (cin >> n >> m)
{
table.clear();
for (int i = 0; i < 2 * n; i++)
table.push_back(i);
int pos = 0; //t走的人的位置
for (int i = 0; i < 2 * n; i++)
{
pos = (pos + m - 1) % table.size();
table.erase(table.begin() + pos);
if(table.size()==n)
break;
}
int j = 0;
for (int i = 0; i < 2 * n; i++)
{
if (!(i % 50) && i)
cout << endl;
if (i == table[j] && j < table.size())
{
j++;
cout << "G";
}
else
cout << "B";
}
cout << endl
<< endl;
}
return 0;
}
set
一、简介
- set是用二叉搜索树实现,集合中的每个元素只出现一次。
- set在建立映射的同时,会自动实现按照键从小到大排序。
二、定义、相关操作
- 定义:
set<Type> A;
定义Type类型的set。 - 存放item:
A.insert(item);
- 删除item:
A.erase(item);
- 清空set:
A.clear();
- 判断是否为空:
A.empty();
- 返回元素个数:
A.size();
- 返回一个迭代器,指向键值k:
A.find(k);
- 返回一个迭代器,指向键值大于等于k的第一个元素:
A.lower_bound(k);
- 返回一个迭代器,指向键值大于k的第一个元素:
A.upper_bound(k);
hdu 2094
map
简介
- map容器可以快速地实现查找。
- map在建立映射的同时,会自动实现按照键从小到大排序。
map的具体操作:
例题:现有n个学生,每人有姓名name,学号id,现在给定一个学生的name,要求查找他的id。
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
map<string, int> student; //定义
string name, stu;
int id, n;
cin >> n; //有n个学生
while (n--)
{
cin >> name >> id; //输入名字和id
student[name] = id; //将两者关联
}
cin >> stu; //输入要查找的学生
cout << student[stu] << endl; //输出id
return 0;
}
一、常用操作:
1.插入:
方法一:pair
map<int, int> mp;//定义
mp.insert(pair<int,int>(1, 2));//插入1,2
方法二:make_pair
map<int, int> mp;
mp.insert(make_pair<int,int>(2,3));
方法三:value_type
map<int, int> mp;
mp.insert(map<int, int>::value_type(3,4));
方法四:[]
map<int, int> mp;
mp[4] = 5;
前三种方法不能出现重复键,第四种方法,若出现重复键会将其覆盖。
2.查找:
方法一:[]
map<int, int> xx;
xx[1] = 3;
cout << xx[1] << endl;//输出3
cout << xx[2] << endl;//输出0
若在map中没有该键位,则输出0。
方法二:map.at()
map<int, int> xx;
xx[1] = 3;
cout << xx.at(1) << endl;
cout << xx.at(2) << endl;
return 0;
方法三:count()
map::count(k),返回map中k出现的次数,为0当然就表示不存在,只能用来判断k是否存在。
3、删除
方法一:删除单个键
xx.erase(key);
方法二:通过迭代器删除
map<int,string>::iterator iter=xx.find(key);
xx.erase(iter);
方法三:删除两个迭代器所指向的范围 [,)左闭右开区间
map<int,string>::iterator itera=xx.find(6);
iter=xx.find(4);
xx.erase(iter,itera);
方法四:删除全部
xx.erase(xx.begin(),xx.end());
xx.clear();
4、遍历
方法一:前序遍历 [ begin(), end() )
map<int, int> xx;
for(map<int, int>::iterator iter = xx.begin();iter != xx.end(); iter++)
cout << xx->first << " " << xx->second << endl;
方法二:后序遍历 [ rbegin(), rend() )
map<int,string> xx;
for(map<int, int>::iterator iter = xx.rbegin();iter != xx.rend();iter++)
cout << xx->first << " " << xx->second << endl;
5、自定义结构体排序
需要对结构体进行重载,一下有两种方式,切记他的排序方式与sort对结构体排序完全相同,优先队列的与sort的完全相反的。
第一种:
struct people
{
int num;
int x;
};
bool operator <(const people &a,const people &b)
{
return a.x>b.x;
};
第二种:
仅仅是比第一种多了个friend
并且移动到结构体上。
struct people
{
int num;
int x;
friend bool operator <(const people &a,const people &b)
{
return a.x>b.x;
}
};