vector(动态数组)
vector为可变长数组(动态数组),定义的vector数组可以随时添加数值和删除元素。需要的头文件vector
。
定义和使用
初始化
//方式一:通过下标访问,假设num数组中已经有了5个元素
cout<<num[4]<<"\n"; //输出第五个数据
//一二维可变数组和普通数组的访问方法一样
//方式二:遍历
for(int i=0;i<num.size();i++)
cout<<num[i]<<" ";//下标范围在[0,num.size()),前开后闭
//方式三:智能指针
for(auto i : num)
cout<<i<<" ";
常用的方法函数
- c.push_back(element) 在尾部加一个数据
- c.pop_back() 删除最后一个数据
- c.size()返回实际数据个数(unsigned类型)
- c.insert(it,x)向任意迭代器it插入一个元素x O(N),例:c.insert(c.begin()+2,-1) 将-1插入c[2]的位置
- c.erase(first,last) 删除[first,last)的所有元素
pair 二元组
pair只含有两个元素,可以看作是只有两个元素的结构体。
头文件utility
(一般引用了iostream
库就行了)
定义和使用
可以创建pair数组,并用first()和second()访问其第一/二个元素。
//定义结构体数组
pair<int,int> a[20];
for(int i = 0; i < 20; i++) {
//和结构体类似,first代表第一个元素,second代表第二个元素
cout << a[i].first << " " << a[i].second;
}
queue(队列)
定义与使用
队列是一种先进先出的数据结构。
描述可为 在饭堂排队,先排队(进入队列)的人能先点菜(出队列)
头文件queue
方法函数
- front() 返回队首元素 O(1)
- back() 返回队尾元素 O(1)
- push() 尾部添加一个元素副本 进队O(1)
- pop() 删除第一个元素 出队 O(1)
- size() 返回队列中元素个数,返回值类型unsigned int O(1)
- empty() 判断是否为空,队列为空,返回true O(1)
Map
头文件map
映射类似于函数的对应关系,每个x对应一个y,而map是每个键对应一个值。
定义与使用
map<变量类型a,变量类型b>mp;
例如:map<string,int>student;可以建立一个学生对应一个年龄的映射关系
特点
内部用红黑树实现,内部元素具有有序性,查询删除等操作复杂度为O(logN)。
有序性也说明map支持lower_bound()
、upper_bound()
、find()
(当数据存在时,返回数据所在位置的迭代器,数据不存在时,返回mp.end()
)和erase()
,复杂度均为O(logN)。
方法函数
- count(key) 查看key元素是否存在,因为map中键是唯一的,所以存在返回1,不存在返回0
- insert({key,value}) 插入元素,插入时要构造键值对
unordered_map
头文件unordered_map
特点
内部用哈希表实现,查找速度非常快(适用于大量的查询操作)。
用法类似于map,均能实现记录映射元素关系。
set 集合
头文件set
有序性,不重复:set容器中的元素不会重复,当插入集合中已有的元素时,并不会插入进去,而且set容器里的元素自动从小到大排序。
类似的还有:
multiset
(元素可以重复,且元素有序),unordered_set
(元素无序且只能出现一次)
方法函数
- size()
- count(element)
- insert(element)