C++ 程序设计
STL 模板
std::set
#include <set>
T 为已重载了 operator < 的类型
定义:
std::set<T> st;
插入元素:
T New_Elem; st.insert(New_Elem);
若元素已存在则什么都不会发生。
删除元素:
T Exist_Elem; st.erase(Exist_Elem);
若元素不存在则什么都不会发生,但是不建议这么干。
查找元素个数:
T Some_Elem;
int exist_cnt = st.count(Some_Elem);
因为不允许重复所以只可能为 0 或 1.
查找元素位置:
T Some_Elem;
std::set<T>::iterator it = st.find(Some_Elem);
不存在返回 st.end()。
二分查找:
T Some_Elem;
std::set<T>::iterator it = st.lower_bound(Some_Elem);
返回首个不小于 Some_Elem 的元素的迭代器。
std::set<T>::iterator itt = st.upper_bound(Some_Elem);
返回首个大于 Some_Elem 的元素的迭代器。
不存在返回 st.end()。
清空:
st.clear();
容器信息:
int siz = (int) st.size()
bool emp = st.empty()
std::multiset
#include <set>
T 为已重载了 operator < 的类型
定义:
std::multiset<T> st;
插入元素:
T New_Elem; st.insert(New_Elem);
若元素已存在则会插入一个新的副本。
删除元素:
T Exist_Elem; st.erase(Exist_Elem);
会删除所有相同的元素。
若元素不存在则什么都不会发生,但是不建议这么干。
删除一个元素:
T Exist_Elem; st.erase(st.find(Exist_Elem));
若元素不存在则会 RE。
查找元素个数:
T Some_Elem;
int exist_cnt = st.count(Some_Elem);
查找元素位置:
T Some_Elem;
std::set<T>::iterator it = st.find(Some_Elem);
一般来说是返回最前面的元素。可能与编译器实现有关。
不存在返回 st.end()。
二分查找:
T Some_Elem;
std::set<T>::iterator it = st.lower_bound(Some_Elem);
返回首个不小于 Some_Elem 的元素的迭代器。
std::set<T>::iterator itt = st.upper_bound(Some_Elem);
返回首个大于 Some_Elem 的元素的迭代器。
不存在返回 st.end()。
清空:
st.clear();
容器信息:
int siz = (int) st.size()
bool emp = st.empty()
std::map
#include <map>
K 为已重载了 operator < 的类型
T 为任意类型
定义:
std::map<K, T> mp;
可以进行嵌套,但不建议这么做。
std::map<K1, std::map<K1, T> > mp_;
插入元素:
K New_Elem; T value;
mp[New_Elem] = value;
删除元素:
K Exist_Elem; int remove_cnt = mp.erase(Exist_Elem);
会删除下标为 Exist_Elem 的元素。
若元素不存在则什么都不会发生。返回值为删除元素个数。
查找元素个数:
K Some_Elem;
int exist_cnt = mp.count(Some_Elem);
因为不允许重复所以只可能为 0 或 1.
不推荐使用 K val = mp[Some_Elem]; 来查找可能不存在的元素,因为如果不存在则会新建节点,造成不必要空间浪费。
清空:
st.clear();
容器信息:
int siz = (int) st.size()
bool emp = st.empty()
std::queue
#include <queue>
T 为任意类型
std::queue<T> q;
加入元素:
T Some_Elem; q.push(Some_Elem);
弹出元素:
q.pop();
若队列为空则会 RE。
访问第一个元素:
T val = q.front();
访问最后一个元素:
T val = q.back();
容器信息:
int siz = (int) q.size();
bool emp = q.empty();
std::stack
#include <stack>
T 为任意类型
std::stack<T> q;
加入元素:
T Some_Elem; q.push(Some_Elem);
弹出元素:
q.pop();
若栈为空则会 RE。
访问第一个元素:
T val = q.top();
容器信息:
int siz = (int) q.size();
bool emp = q.empty();
std::deque
#include <deque>
T 为任意类型
std::deque<T> dq;
用法和 std::vector<T> 类似
访问元素:
T First_Elem = dq.front();
T Last_Elem = dq.back();
T Some_Elem = dq[val];
添删元素:
以下操作复杂度均为均摊常数。
T Some_Elem;
在末尾添加元素 dq.push_back(Some_Elem);
在开头添加元素 dq.push_front(Some_Elem);
在末尾删除元素 dq.pop_back();
在开头删除元素 dq.pop_front();
清空:
dq.clear();
容器信息:
int siz = (int) q.size();
bool emp = q.empty();
std::priority_queue
#include <queue>
T 为定义了 operator < 的类型
std::priority_queue<T> q;
访问元素:
T Top_Elem = q.top();
添删元素:
T Some_Elem; q.push(Some_Elem);
q.pop();
若队列为空则执行 pop() 会 RE。
容器信息:
int siz = (int) q.size();
bool emp = q.empty();