C++ 标准模板库(STL)入门

一、vector (向量 / 变长数组)

  1. 预处理。需要包含头文件 <vector> ,使用标准命名空间 using namespace std。
  2. 定义。vector <typename> v;typename 为类型名,可以为简单或自定义类型。
  3. 访问方式。① 和数组一样通过下标访问,v[i] 表示第 i + 1 个元素;②通过迭代器(iterator)访问,迭代器类似指针,vector <typename> :: iterator it 即定义了迭代器 it ,可以通过 *it 访问 vector 中的元素。auto it = v.begin(),则是定义了指向 vector 第一个元素的迭代器 it。只有在 vector 和 string 中,可以通过 it + n 得到当前迭代器之后的第 n 个迭代器。
  4. 常用函数。push_back(), pop_back(), size(), claer(), insert(), erase() 等。具体用法 Visual Studio 中会有提示。(ps:VS 宇宙第一IDE 的称号真的是名不虚传)
  5. 常见用途。①储存不确定元素个数的数组;②用邻接表存储图。

二、set (集合)

  1. 预处理。需要包含头文件 <set> ,使用标准命名空间 using namespace std。
  2. 定义。set <typename> s;typename 为类型名,可以为简单或自定义类型。
  3. 访问方式。只能通过迭代器访问。迭代器用法和 vector 相同。
  4. 特殊之处。set 内的元素自动递增有序,且自动去除了重复元素。
  5. 常用函数。insert(), find(), erase(), size(), clear()。
  6. 常见用途。需要自动去重并且按升序排列的情况。

三、string(串)

  1. 预处理。需要包含头文件 <string> ,使用标准命名空间 using namespace std。
  2. 定义。string s 即可。若需初始化可以使用 string s = "abc"。
  3. 访问方式。① 和数组一样通过下标访问,s[i] 表示第 i + 1 个字符;②通过迭代器(iterator),和 vector 用法相同。
  4. 特殊之处。要读入和输出整个字符串,只能使用 cin 和 cout。如果要使用 scanf 和 printf,可以使用 c_str() 函数将string 转换为字符数组或是使用 &s[0],即用第一个字符的地址代替串。注意使用 scanf 要先用 resize() 函数给 string 分配空间。
  5. 常用操作。+, ==, !=, <, <=, >, >=。
  6. 常用函数。 length() / size(), insert(), erase(), clear(), substr(), find(), replace()。
  7. string :: npos。这是一个常数,值为 -1,作为 find() 函数失配时的返回值。

四、map (映射 / 散列)

  1. 预处理。需要包含头文件 <map> ,使用标准命名空间 using namespace std。
  2. 定义。map <typename1, typename2> m, 即定义了从 typename1 (键 key)映射到 typename2 (值 value)的 映射 m。不能使用 char 数组作为键。
  3. 访问方式。① 通过下标访问,m[key] 将得到 key 映射到的值 value,map 中 key 唯一;②通过迭代器(iterator)访问,和其他容器的迭代器用法相同。
  4. 特殊之处。map 内部会以键从小到大的顺序自动排序。有个疑问,如果自己定义的类型没有指定大小关系呢?
  5. 常用函数。find(), erase(), size(), clear()。

五、 queue(队列)

  1. 预处理。需要包含头文件 <queue> ,使用标准命名空间 using namespace std。
  2. 定义。queue <typename> q。
  3. 访问方式。q.front() 访问队首元素,q.back() 访问队尾元素。
  4. 常用函数。push(), front(), back(), pop(), empty(), size()。
  5. 常见用法。先进先出结构。

六、priority_queue (优先级队列)

  1. 预处理。需要包含头文件 <queue> ,使用标准命名空间 using namespace std。
  2. 定义。priority_queue <typename> pq。
  3. 访问方式。只能通过 top() 函数来访问队首元素,也就是优先级最高的元素。
  4. 常用函数。push(), top(), pop(), empty(), size()。
  5. 优先级设置。①基本数据类型的优先级设置:默认是数字大的优先级高。priority_queue <int> pq 和 priority_queue <int, vector <int>, less <int> > pq 是等价的,其中 vector <int> 是承载底层数据结构堆(heap)的容器,less <int>是一个比较类,less <int> 表示数字大的优先级大,greater <int> 表示数字小的优先级大。②结构体的优先级设置:需要在结构体内部以友元方式重载小于号 <,且只需重载小于号即可。优先级队列的优先关系和 sort() 函数中的排序顺序恰好是反的。 
  6. 常见用途。解决一些贪心问题或是对 Dijkstra算法进行优化。

七、stack (栈)

  1. 预处理。需要包含头文件 <stack> ,使用标准命名空间 using namespace std。
  2. 定义。stack <typename> s。
  3. 访问方式。只能通过 top() 函数访问栈顶元素。
  4. 常用函数。push(), top(), pop(), empty(), size()。
  5. 常见用法。先进后出结构;模拟实现递归等。

八、pair

  1. 预处理。需要包含头文件 <utility> ,使用标准命名空间 using namespace std。
  2. 定义。pair <typename1, typename2> p,可使用 pair <string, int> p("haha", 5) 进行定义时初始化。若需要临时构建 pair,则可以 ① pair <string, int>("haha", 5) ②make_pair("haha", 5)
  3. 访问方式。两个元素分别为 first 和 second,按照正常结构体的方式访问即可。
  4. 常用操作。==, !=, <, <=, >, >=。
  5. 常见用法。①代替二元结构体及其构造函数;②作为 map 的键对进行插入。

九、algorithm 头文件中常用函数

  1. max(), min(), abs()。注意 abs(x) 返回 x 的绝对值,x 必须是整数,若需浮点型的绝对值需使用 math 头文件下的 fabs() 。
  2. swap()。
  3. reverse()。
  4. next_permutation(), 给出一个序列在全排列的下一个序列。
  5. fill(), 可以把数组或容器中的某一段区间赋为某个相同的值。memset() 只能按字节赋值,而 fill() 按单元赋值,更强大。
  6. sort(), stable_sort(), 很简单啦。
  7. lower_bound(first, last, val), 用来寻找在有序数组或容器中 [first, last) 范围内第一个值大于等于 val 的元素的位置,如果是数组,返回指针,容器返回迭代器。upper bound(first, last, val), 用来寻找在有序数组或容器中 [first, last) 范围内第一个值大于 val 的元素的位置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值