0x71 C++STL


  本章将介绍 S T L STL STL 中的 v e c t o r , q u e u e , p r i o r i t y _ q u e u e , d e q u e , s e t , m u l t i s e t , m a p , b i t s e t vector,queue,priority\_queue,deque,set,multiset,map,bitset vectorqueuepriority_queuedequesetmultisetmapbitset 八个部分。
  同时还会介绍算法头文件中的部分函数。

#include <vector>(动态数组)

   v e c t o r vector vector S T L STL STL 的动态数组,其内部实现基于倍增思想1,在程序运行时能根据需求改变数组的大小。
   v e c t o r vector vector 支持随机访问,它的内存空间同数组般是连续的,所以索引可以在常数时间内完成。但是在中间进行插入和删除操作会造成内存块的复制,与链表不同这种操作无法在 O ( 1 ) O(1) O(1) 完成,为保证效率元素的删减一般在末尾进行,因此我们将不会在动态数组中使用在数组中间插入和删除的功能(虽然可以)。

声明

  • int型
代码释义
vector<int> a;相当于一个长度动态变化的 i n t int int 数组
vector<int> a(b);用b定义a
vector<int> a(10);初始 10 10 10 0 0 0 元素
vector<int> a(10,6);初始 10 10 10 6 6 6 元素
  • string型
代码释义
vector<string> a(10,“null”);初始 10 10 10 n u l l null null 元素
vector<string> vec(10,“hello”);初始 10 10 10 h e l l o hello hello 元素
vector<string> b(a.begin(),a.end());b是a的复制
  • 结构型

a用来储存坐标

struct point{int x,y;}; 
vector<point> a;

常用操作

push_back/pop_back

  a.push_back(x); 把元素 x 插入到vector 的尾部。
  a.pop_back(); 删除 vector 的最后一个元素。

size/empty

  a.size(); 返回 vector 的实际长度。
  a.empty(); 返回一个 bool 类型,表明 vector 是否为空。两者的时间复杂度均为 O ( 1 ) O(1) O(1)
  所有的 S T L STL STL 均支持这两种方法,含义也相同。后面将不会重复提到。

clear

  a.clear(); 将 vector清空。

begin/end

  a.begin(); 返回vector 中的第一个元素的迭代器2。例如 a 是一个非空的 vector,则 *a.begin() 与 a[0] 的作用相同。
  a.end(); 返回 vector 的尾部,即第 n 个元素再往后的“边界”,*a.end()与 a[n] 都是越界访问。其中 n=a.size()。
  下面两份代码都遍历了 vector<int> a; 并输出其所有元素。

for(int i=0;i<a.size();i++){
	cout<<a[i]<<" "; 
}

for(vector<int>::iterator it=a.begin();it!=a.end();it++){
	cout<<*it<<" ";
}

front/back

  a.front() 返回 vector 的第一个元素,等价于 *a.begin() 和 a[0]。
  a.back() 返回 vector 的最后一个元素,等价于 *-- a.end() 和 a[a.size()-1]。

reverse

  reverse(a.begin(), a.end()) 将 vector 翻转。
  该函数包含在 算法头文件中,其时间复杂度为 O ( n ) O(n) O(n)

sort

  sort(a.begin(), a.end()); 使用sort函数排序,从小到大排

#include <bitset>

   b i t s e t bitset bitset 可以看作一个多位二进制数,每八位占用一个字节,相当于采用了压缩状态的二进制数组,并支持基本的位运算。在估算程序运行的时间的时,我们一般以 32 32 32 位整数的运算次数为基准,因此 n n n 位的 b i t s e t bitset bitset 执行一次位运算的复杂度可视为 n 32 \frac{n}{32} 32n

声明

bitset<10000> s;
  表示一个 10000 10000 10000 位的二进制数,<> 中填写位数。下面把数位记为 n n n

常用操作

代码注释
同二进制逻辑运算位运算操作符
s[k]和数组相同用法
s.count()返回有多少位 1 1 1
s.any()若 s 所有位为 0 返回 false,若至少有一位为 1 则返回 true
s.none()与s.any() 相反
s.set() s s s 的所有位变成 1 1 1
s.set(k,v)同等于 s [ k ] = v s[k]=v s[k]=v
s.reset() s s s 的所有位变为 0 0 0
s.reset(k)同等于 s [ k ] = 0 s[k]=0 s[k]=0
s.flip() s s s 的所有位取反
s.flip(k) s s s 的第 k k k 位取反,同等于   s [ k ] ~s[k]  s[k]

  1. 倍增思想:
      设 n , m n,m n,m v e c t o r vector vector 的实际长度和最大长度。当加入一个元素前有 n = m n=m n=m 时,则在内存中申请一块大小为 2 m 2m 2m 的连续空间,并把内容转移到新的地址上(释放旧空间),然后插入元素。当删除一个元素后,若 n ≤ m 4 n\leq\frac{m}{4} n4m,则释放一半的空间。
      总之,倍增思想是保持实际长度不会超过最大长度的一半。 ↩︎

  2. 迭代器:
      迭代器就像 S T L STL STL 的“指针”,可以用 “*” 操作符解除引用。
      一个保存 i n t int int v e c t o r vector vector 的迭代器的声明方法为:vector<int>::iterator it;
      vector 迭代器是“随机访问器”,可以把 vector 的迭代器与一个整数相加减,其行为和指针的移动类似。可以把两个 vector 的迭代器相减,其结果也和指针相减类似,得到两个迭代器对应下标的距离。 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值