常用的 STL 函数
介绍
容器, 迭代器, 算法
容器:
顺序容器 (vector, list, deque, string), 有序集合 关联容器 (set, multiset, map, multimap), 包含查找元素到键值
迭代器: 遍历容器 traverse container
算法库: 排序, 不可变序, 变序性, 数值
迭代器可以使用 +1 的, vector, string, list, dequeu
不可以使用迭代器的, stack, queue, priority_queue
string
s.length();
s = s + "abc";
s = "123456"; cout << s.substr(1); // 23456 cout << s.substr(1, 2); // 23
队列
queue<int> q;
q.push(3); q.pop(); // 无法返回 q.front(); q.back(); q.size(); q.empty();
deque<int> dq;
dq.push_back(2); dq.push_front(-1); dq.pop_back(); dq.pop_front(); cout << dq[0]; // -1 dq.size(); dq.insert(d.begin()+2, 0); // 在第三位插入 dq.erase(d.begin()); dq.clear();
最大堆
priority_queue<int> pq;
pq.push(); pq.pop(); pq.top(); pq.size(); pq.empty();
声明一个最小堆
priority_queue<int, vector<int>, greater<int> > que;
自定义排序
struct mycomp { bool operator() (const int &a, const int &b) { return a > b; } }; priority_queue<int, vector<int>, mycomp> pq; // vector<int> 显式说明内部结构是 vector
集合
set<int> s; (本身用二叉搜索树实现), 默认从小到大排好序
s.insert(3); s.erase(3); s.find(3); s.count(3); s.size(); s.empty(); s.clear();
multiset<string> ms; ms.insert("abc"); ms.insert("abc"); ms.insert("abc"); ms.insert("123"); ms.insert("456"); multiset<string>::iterator iter; for (iter = ms.begin(); iter != ms.end(); iter++) { std::cout << *iter << std::endl; }
哈希 map, pair
pair<int, int> p;
p = make_pair(2, 3);
pair<int, pair<int, int> > p2;
p2 = make_pair(2, make_pair(3, 4)); cout << p2.second.second << endl; // 4
int cmp(pair<int, int> a, pair<int, int> b) { // 从小到大排序 return a.first < b.first; }
map<int, string>m;
m.insert(make_pair(1, "one")); m.insert(make_pair(2, "two"));
map<string, float> m; m["jack"] = 11.1; m["bomi"] = 23.23; m["kate"] = 34.234; map<string, float>::iterator iter; for(iter = m.begin(); iter != m.end(); iter++) { cout << (*iter).first << " : "; cout << (*iter).second << endl; } // bomi : 23.23 // jack : 11.1 // kate : 34.234
find
std::map<int, string>::iterator iter = m.find(25); if (iter != m.end()) {...} else {...}
自定义比较
struct mycomp { bool operator() (const int &a, const int &b) { return a > b; } }; map<int, char, mycomp> m; m[0] = ‘a‘; m[1] = ‘z‘; m[25] = ‘b‘; std::map<int, char, mycomp>::iterator iter; for(iter = m.begin(); iter != m.end(); iter++) { cout << "m[" << (*iter).first << "] = " << (*iter).second << endl; } // m[25] = z // m[1] = b // m[0] = a
允许多个 key 值
/* multiset */ multimap<string, int> m; m.insert(pair<string, int>("jack", 400)); m.insert(pair<string, int>("kity", 200)); m.insert(pair<string, int>("memi", 500)); m.insert(pair<string, int>("jack", 300)); std::multimap<string, int>::iterator iter; for(iter = m.begin(); iter != m.end(); iter++) { cout << (*iter).first << " : " << (*iter).second << endl; } // jack : 400 // jack : 300 // kity : 200 // memi : 500 m.erase("jack"); for(iter = m.begin(); iter != m.end(); iter++) { cout << (*iter).first << " : " << (*iter).second << endl; } // kity : 200 // memi : 500
list
list<int> l; l.push_back(1); l.push_front(0); l.pop_front(); l.pop_back(); l.reverse(); l.remove(1); // 删除所有为 1 的元素 l.erase(l.begin()); // 用迭代器删除 l.clear(); l.size(); l.sort(); l.unique();
std::list<int>::iterator iter = find(l.begin(), l.end(), 1); // #include<algorithm> if (iter != l.end()) { ... } else { ... }
std::list<int>::iterator iter; for(iter = l.begin(); iter != l.end(); iter++) { std::cout << *iter << std::endl; } std::list<int>::reverse_iterator riter; for(riter = l.rbegin(); riter != l.rend(); riter++) { std::cout << (*riter) << std::endl; }
vector
vector<int> v; // 创建一个向量, 类似一维数组 vector<int> v[3]; // 类似 二维数组 vector<int> v(10); // 创建 10 个元素, 每个元素都是 0 vector<int> v(10, 5); // 创建 10 个元素, 每个元素都是 5 v.insert(5); v.insert(v.begin(), 1); // v[0] = 1 v.push_back(5); v.erase(v.begin()); v.erase(v.begin()+2, v.begin()+5); // 删除 第 3, 4, 5 个 v.clear(); v.size(); v.empty(); reverse(v.begin(), v.end()); sort(v.begin(), v.end());
自定义排序
bool cmp(const int &a, const int &b) { return a > b? 1: 0; // 降序 return a < b? 1: 0; // 升序 } sort(v.begin(), v.end(), cmp);