C++ STL笔记

CPP网址

STL六大组件

  • 容器 算法 迭代器 适配器 仿函数 分配器

string 字符串

  • #include <string>

  • size(), length() 获得长度

  • find() 查找 形参有1个或2个

  • string::npos 值为-1,字符串末尾

  • insert() 插入

  • substr() 字符串截取

  • replace() 替换 形参有3个

  • #include <algorithm> reverse(str.begin(), str.end()) : 可以将字符串反转


vector不定长数组

  • #include <vector> 动态数组 底层为顺序表(数组)
  • 初始化
vector<int> v(5); //初始化5个int大小数组,里面为空
vector<int> v(5, 1); 初始化5个int大小数组,里面每个值为1
vector<vector<int> > v(5, vector<int>(6, 7)); //5行6列值为7
  • size() 获得大小
  • push_back() emplace_back() 尾部插入元素 形参有1个
  • 扩容操作 取决于编译器去扩容 有些是2倍扩容 有些是1.5倍扩容
vector<int> v;
int tmp = -1;
for (int i = 0; i < 1000000; ++i) {
    if (tmp != v.capacity()) {
        tmp = v.capacity();
        cout << tmp << endl;
    }
    v.emplace_back(i);
}
  • capacity() 当前容量大小

stack

  • 容器适配器 双端队列组成 #include <stack>
  • size() 存储元素数量
  • push() 栈顶插入元素
  • pop() 弹出栈顶元素
  • top() 访问栈顶元素
  • empty() 判断是否为空

queue 队列

  • 容器适配器 双端队列组成 #include <queue>
  • size() 队列元素数量
  • push() 队列尾插入元素
  • pop() 队首元素出列
  • front() 访问队首元素
  • back() 访问队尾元素
  • empty() 判断是否为空

deque 双端队列

  • 顺序容器 支持随机访问,由指针表存储 #include <deque> 底层为循环队列
  • size() 返回内部存储数量
  • push_front() 队列前插入元素
  • push_back() 队列后插入元素
  • pop_front() 队列前删除元素
  • pop_back() 队列后删除元素
  • empty() 判断是否为空
  • front() 访问队首元素
  • back() 访问队尾元素

priority_queue 优先队列

  • 按照优先级出队 用堆(数组模拟二叉树)存储 默认大顶堆,优先级高的在树根 插入删除O(logn) #include <queue>
  • priority_queue<数据类型, 容器, 比较方法> 可实现小顶堆 优先级小的在树根 第二个容器参数默认vector,第三个比较方法参数默认less
priority_queue<int, vector<int>, greater<int> > que; //小顶堆
  • size() 返回内部存储数量

  • push() 插入元素

  • pop() 删除堆顶元素

  • top() 访问堆顶部元素

  • empty() 是否为空

  • 自定义类型node使用优先队列

    struct node {
        int x, y;
    }
    

    1)需要在自定义类型node里重载小于号运算符< 只能重载小于号运算符

struct node {
    int x, y;
    bool operator< (const node &b) const {
    	return this->x < b.x;
	}
}

​ 2)使用仿函数实现自定义类型node使用

struct cmp {
    bool operator() (const node &a, const node &b) {
        return a.x < b.x;
    }
}
priority_queue<node, vector<node>, cmp> que; 

set 集合

  • 排序 去重 #include <set> 底层为红黑树

  • size() 返回内部存储数量

  • insert() 插入元素

  • erase() 删除元素

  • count() 查找元素

  • 自定义类型node使用集合

    struct node {
        int x, y;
    }
    

    1)需要在自定义类型node里重载小于号运算符<

struct node {
    int x, y;
    bool operator< (const node &b) const {
    	return this->x < b.x;
	}
}

map 键值对

  • 按照键去排序 里面装pair 有序键值队容器 #include <map> 底层为红黑树
  • size() 元素数量
  • insert(make_pair(键, 值)) 插入 make_pair需要引入头文件 #include <utillity>
  • count() 查找
  • erase() 删除
  • 可通过数组下标直接访问

unordered_set

  • 无序 C++11才有 #include <unordered_***>底层为哈希表
  • 用法和对应的set一样

unordered_map 哈希表

  • C++11标准
  • 无序 C++11才有 #include <unordered_***>底层为哈希表
  • 用法和对应的set、map一样
    • 头文件:《hash_map》《ext/hash_map》
  • 命名空间:__gnu_cxx
  • 声明:hash_map<key_type, value_type, hash_func> h;
  • 内置方法:1)h.find(key); 2) h[key] = value; 3) h[key]; 4) h.begin(); 5) h.end();

hash_map 哈希表

  • 用法和unordered_map一样,区别在于此用法是非标准的

multiset multimap

  • 元素可以重复
  • 还有unordered_multiset unordered_multimap 即表示无序且可元素重复

list 的底层为双向链表 hash_set 的底层为哈希表

sort()排序函数

  • 头文件:#include <algorithm>
  • 时间复杂度 n*log2n
#include <iostream>
#include <algorithm>
using namespace std;

bool cmp(const int &a, const int &b) {
    return a > b; //从大到小排序 不能有等于=号
    //return a < b; //从小到大排序
}

int main() {
    int arr[3] = {10, -2, 100};
    sort(arr, arr + 3, cmp);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值