stdC++ STL|C++标准STL
Containers|容器
简单容器
pair
定义于<stl_pair.h>中,需要使用命名空间std。
pair是一个 对 ,用于存储一对类型可能不同的量。
使用方法是
1 | pair<typename A,typename B>p;//即定义了一个拥有两个可以不同类型的对 |
相当于定义了一个p[2],其中p[0]的类型为A,p[1]的类型为B。
访问方式是
1 | p.first p.second |
p.first相当于p[0],p.second相当于p[1]。
赋值方式是
1 | pair<typename A,typename B>p(a,b); |
这样就相当于把一个类型为A的量a赋值到p.first,把一个类型为B的量b复制到p.second。
其他
pair间支持逻辑运算符(两个pair的A、B类型必须对应相同)
1 | != < <= == > >= |
支持函数
1 | void swap |
swap可以交换两个pair(两个pair的A、B类型必须对应相同),是将两个pair中的first互换,second互换。
写到其他的类型里(不过此时要注意两个’>’不要挨着否则会被判CE),例:
1 | vector<pair<string,int> >v; |
而且,pair也支持写到pair的类型A、B里,例如:
1 | pair<int,pair<pair<pair<int,int>,int>,int> >p; |
序列式容器
vector
定义于<stl_vector.h>中,需要使用命名空间std。
vector的实质就是一个数组,下标从0开始,只不过这个数组是一个空间动态的数组,一个空的vector当插入第一个数时空间为1,插入第二个数时空间为2,插入第三个数时空间为4,插入第四个数时空间为4,插入第五个数时空间为8……其空间每次需要开新的空间时倍增,所以不能直接访问无空间缓存的下标,但是可以通过初始化直接开对应大小,向后插入需要新空间时倍增。
使用方法是
1 | vector<typename A>v; |
首先的一个是定义了一个存储类型为A的空vector。
访问方式是
1 | v[i] |
对,就是这样,不是说了就是一个数组么。。。
插值方式是
1 | v.push_back(a);//向数组末尾插入一个a |
删值方式是
1 | v.pop_back();//将数组末尾数删除 |
遍历方式是
1 | v.at(pos);//返回pos位置的数 |
其他
如何判断一个vector是否为空?
1 | v.empty();//空则返回true,非空则返回false |
vector的大小?
1 | v.size();//返回已有元素个数 |
另:重新分配函数:(Cr.剑西楼)
1 | v.resize(n); |
resize重新分配大小,改变容器大小,并且创建对象。
当n小于当前size()值时候,vector首先会减少size()值 保存前n个元素,然后将超出n的元素删除(remove and destroy)。
当n大于当前size()值时候,vector会插入相应数量的元素,使得size()值达到n,并对这些元素进行初始化,如果调用上面的第二个resize函数,指定a,vector会用a来初始化这些新插入的元素。
当n大于capacity()值的时候,会自动分配重新分配内存存储空间。reserver函数用来给vector预分配存储区大小,即capacity的值,但是没有> 给这段内存进行初始化。reserve的参数n是推荐预分配内存的大小,实际分> 配的可能等于或大于这个值,即n大于capacity的值,就会reallocate内存 capacity的值会大于或者等于n。这样,当ector调用push_back函数使得size 超过原来的默认分配的capacity值时 避免了内存重分配开销。
需要注意的是:reserve 函数分配出来的内存空间,只是表示vector可以利用这部分内存,但vector不能有效地访问这些内存空间,访问的时候就会出现越界现象,导致程序崩溃。
vector间支持逻辑运算符(两个vector的A类型必须对应相同)
1 | != < <= == > >= |
支持函数
1 | void swap |
swap可以交换两个vector(两个vector的A类型必须对应相同),是将两个vector所有数互换。
二维或更多维
1 | vector<vector<int> >v(r,vector<int>(c,0)); |
这便定义了一个r行$\times$c列大小的v数组。
list
定义于<stl_list.h>中,需要使用命名空间std。
使用方法是
1 | list<typename A>l; |
其他
list间支持逻辑运算符(两个list的A类型必须相同)
1 | != < <= == > >= |
list的iterator(迭代器)间支持逻辑运算符(两个list的A类型必须相同)
1 | != == |
支持函数
1 | void swap |
swap可以交换两个list(两个list的A类型必须相同),是将两个list互换。
slist
deque(double-ended queue)
适配器容器
stack
queue
priority_queue
关联式容器
set
multiset
map
multimap
hash_set
hash_multiset
hash_map
hash_multimap
其他类型容器
bitset
valarray
Iterators|迭代器
utility
iterator
memory
Allocator|空间配置器
Adapters|配接器
Algorithms|算法
algorithm
numeric
functional
Functors|仿函数
extC++ STL|C++扩展STL
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏