文章目录
- deque
- 声明
- 函数
- 代码实现🚀
- set
- 声明
- 迭代器
- size/empty/clear
- begin/end
- insert
- find
- lower_bound/upper_bound
- erase
- count
- 代码实现🚀
- map
- 声明
- 代码实现 🚀
deque
前一篇博客提到过,deque是双端队列,在队头和队尾进行插入和删除都是O(1)的时间复杂度。但所有的操作平均下来的时间画的比vector多。
声明
#include<deque>
queue<int>a=({1,2,3,4});
函数
基本用法都一致,begin、end、front、back、push_back、push_front、pop_back、pop_front、clear
代码实现🚀
#include <iostream>
#include <deque>
using namespace std;
int main()
{
deque<int>a;
a.begin(), a.end(),a.front(), a.back();
a.push_back(1);//在最后插入一个元素
a.push_front(2);//在队头插入一个元素
a[0];//随机访问一个数据元素
a.pop_back();//弹出最后一个元素
a.pop_front();//弹出第一个元素
a.clear();
system("pause");
return 0;
}
set
头文件set包含set和multiset分别表示有序集合和多重有序集合。也就是说在在set中不会有重复出现的元素,而multiset中允许有重复的元素。
声明
#include<set>
set<int>a;
迭代器
set和multiset的迭代器称为“双向访问迭代器”,不支持随机访问,仅支持带(*)解除引用,运算符号也仅只支持“++”和“- -”。
在访问迭代器时,若迭代器it++,指向下一个元素为这个集合从小到大排序的下一个元素。
set<int>a=({2,1,6,4});
size/empty/clear
与vector相似
begin/end
时间复杂度都为O(1),用法一致(左开右闭)。
insert
插入一个元素进入集合,时间复杂度为O(logn)。在set中如果已经集合中已有该元素,则不会插入,堆集合的状态也不会有影响。
a.insert(1);
find
该函数是用来查找一个元素,如果集合中存在该元素就返回指向该元素的迭代器,相反则返回a.end()。时间复杂度为O(logn)。
a.find(3);
lower_bound/upper_bound
时间复杂度为O(logn)。
lower_bound返回的是大于等于该元素最小的值。
upper_bound返回的是小与该元素最大的值。
a.lower_bound(2);
a.upper_bound(5);
erase
erase函数是用来删除指定元素的,需要被删除元素的迭代器或者就是该元素,如果在multiset中就是删除多个与指定元素相同的元素。时间复杂度为O(k+logn)。k为相同元素的个数。
a.erase(it);//it为指向x的迭代器
a.erase(x);//与上行代码作用一致
count
返回集合中该元素的个数,O(k+logn)
a.count(3);
代码实现🚀
#include <iostream>
#include <set>
using namespace std;
//底层实现为红黑树
int main()
{
set<int> a({1,2,3,4});//元素不可以重复
multiset<int> b;//元素可以重复
set<int>::iterator it = b.begin();//迭代器
++it, --it;
it++, it++;
a.end();//表示最后一个元素
a.insert(5);//插入一个元素,时间复杂度为O(logn)
a.find(2); //查找一个元素,返回该元素下标。如果没找到该元素,就返回a.end()
a.lower_bound(2);//找到大于等于2的最小元素的迭代器
a.upper_bound(4);//找到小于4的最大元素的迭代器
a.erase(it);//删除删除迭代器it所指向的元素,时间复杂度为O(logn)
a.erase(2);//删除等于2的所有元素,时间复杂度为O(k+logn),k=2的个数
a.count(2);//返回集合中等于2的元素个数,时间复杂度为O(k+logn),k=2的个数
struct Rec //自己定义一个set
{
int x, y;
bool operator<(const Rec& t)const
{
return x < t.x;
}
};
system("pause");
return 0;
}
map
map容器是一个键值对key-value的映射。其中key要定义小于号运算符 。
声明
#include<map>
map<int><int> a;//存储的是一个有序数对
类型可以不一样
map<string, int>a;
a["op"] = 2;
cout << a["op"] << endl;
find/insert/begin/end/clear均与set类似
代码实现 🚀
#include <iostream>
#include <map>
#include <vector>
using namespace std;
//底层实现为红黑树
int main()
{
map<int,int> a;//存储的是一个二维数组,有序数对。
a[1] = 2;
a[100000000] = 3;
cout << a[10000000] << endl;
map<string, int>a;
a["op"] = 2;
cout << a["op"] << endl;
map<string, vector<int>>a;
a["op"] = vector<int>({1,2,3,4});
cout << a["op"][2] << endl;
system("pause");
return 0;
}