set库包含两个:set 和multiset
set 是有序集合 ,multiset 是有序多重集合。
头文件:
# inlcude<set>
声明方法:
set<int> s ;
set<int> s1 = {2,3,1} ; // 不管怎么初始化,set都会默认从小到大排成有序的序列
set<int,greater<int>> s2 = {3,1,5,2} ; // 加上greater<>后就会把它变成从大到小排序
set<double> s3 ;
multiset<set> s4 ;
操作:
1. .size()、.empty()、.clear()
和vector容器是类似的
2.迭代器 .begin() .end()
vector的时候就再说迭代器,就把它理解为指针即可,可以使用*解除引用,支持++ 、--操作
一定要注意,所有的.end()方法(不仅是set的.end(),这里说的是所有容器的.end())都是返回的是序列最后一个元素的后一个位置,即是越界的!
set<int>::iterator it ; // 迭代器可以支持*解除引用取元素值,支持 ++ 、--
for(it = s.begin() ; it != s.end() ; it ++)
{
cout << *it << " " ;
}
3. .insert(x)、.find(x)
.insert(x)将x插入到有序set中
.find(x)查找x,若找到,就返回该元素的迭代器,若找不到就返回s.end() (这里*s.end()是一个不确定的值,因为s.end()已经越界了,相当于s[s.size()] )
4. .erase(x)
删除元素x
5. .count(x)
返回x的个数
6. .lower_bound()、upper_bound()
s.lower_bound(x)查找大于等于x的元素中最小的一个,并返回指向该元素的迭代器
s.upper_bound(x)查找大于x的元素中最小的一个,并返回指向该元素的迭代器
试一试:
# include<iostream>
# include<set>
using namespace std ;
int main()
{
// 包含set 和 multiset一个是有序集合,另一个是有序多重集合(可以有重复)
set<int> s = {1,2,3} ;
set<int ,greater<int>> s2 = {1,5,2,4,3} ; // 从大到小排序
set<double> sd ;
multiset<int> ms ;
// size empty clear 都可以
cout << "s.size() : " << s.size() << endl ;
cout << "s.empty() : " << s.empty() << endl ;
s.clear() ;
cout << "s.size() : " << s.size() << endl ;
cout << "s.empty() : " << s.empty() << endl ;
s = {4,5,2,6} ;
// 迭代器 .insert(x) .find(x) .begin() .end()
s.insert(3) ;
cout << "s.size() : " << s.size() << endl ;
set<int>::iterator it ; // 迭代器可以支持*解除引用取元素值,支持 ++ 、--
for(it = s.begin() ; it != s.end() ; it ++)
{
cout << *it << " " ;
}
cout << endl ;
for(it = s2.begin() ; it != s2.end() ; it++)
{
cout << *it << " " ;
}
cout << endl ;
cout << "*s.find(1):" << *s.find(1) << endl ; // 找到就返回指向该元素的迭代器,没有找到就返回s.end() 相当于s[s.size()],注意,是越界的!!
cout << "*s.find(4):" << *s.find(4) << endl ;
// .erase(x) 删除元素x
s.erase(2) ;
for(it = s.begin() ; it != s.end() ; it ++)
{
cout << *it << " " ;
}
cout << endl ;
cout << "count:" << s.count(4) ;
return 0 ;
}
头文件
# include<utility>
声明:
pair<int,int> p ;
pair<int,string> p2 ;
p = {1,2} ;
操作:
.first()和.second()取两个元素
pair和vector都支持比较,a ==b a!=b a>b a<b 等等按照字典序来比较
非常nb
和python中的字典类似
可以将key和value映射起来
头文件:
# incldue<map>
声明:
总之就是:map<key_type,value_type> name ;
map<double,int> h ;
map<string,int> h2 ;
map<pair<int,int>,string> h3 ;
操作:
1. .size() .empty() .clear()
2. .insert({key,value}) .erase(key)
3. [] 操作符
[] 操作,像数组一样可以去取key来得到value,还可以通过h[key]来进行赋值,时间效率是O(logn)。
试一试:
# include<iostream>
# include<map>
using namespace std ;
int main()
{
map<string,int> rank ;
map<pair<int,int>,int> h ;
// .insert({}) .erase({}) .size() .empty() .clear
rank.insert({"rds",1}) ;
h.insert({{1,1},2}) ;
cout << rank.find("rds")->second << endl ;
cout << rank["rds"] << endl ;
// .find(key) 查找有没有key为key的元素
cout << h.find({1,1})->second<< endl ;
// [] 操作,像数组一样可以去取下标,只不过时间效率是O(logn)
cout << h[{1,1}] << endl ;
rank.erase("rds") ;
cout << rank.size() ;
return 0 ;
}
头文件
# include<unorder_map> map是无序的,但是时间效率是O(1)
# include<unorder_set> set是无序的,不支持二分 时间效率是O(1)
# include<bitset> 这个是提供了一个容纳二进制串的容器
声明
bitset<1000>a , b ;ab两个二进制串都是1000
操作:
a.set(3)把a[3]设置成1
a.reset(3)把a[3]设置成0