粗略总结记录STL的知识
1. STL基本构成
容器 ---- 迭代器 ----算法 容器:存储数据的容器 迭代器:提供给算法用于查找容器数据的标识 ==》类似”指针“? 算法:操作数据的工具
2. vector
单口容器(类似于栈) 可变动态数组 数据添加删除:v.push_back(X); v.pop_back(); 迭代器:v.begin() v.end() v.rbegin() v.rend(); 容量(v.cepacity()):添加元素 空间不足时 扩大一倍 大小(v.size()) :当前元素存储使用的大小 预留大小 resever : 预留容量,减少扩大的次数 收缩空间: 可以使用swap() ==>> vector<int>(v).swap(v); vector<int> : 匿名对象 (v) : 使用v初始化匿名对象 swap(v) : 将v和匿名对象交换 结束时,匿名对象销毁
3. deque
双口容器两端操作 和vector类似的数组空间,但扩大是分段链接的 插入:push_front() push_back() 删除:pop_front() push_front() 迭代器:d.begin() d.end(); 排序算法 sort(d.begin(),d.end())
4. stack 栈
先进后出 (可以理解为子弹弹夹) stack<int> s; s.top(); 返回栈顶元素 s.pop(2); 入栈 s.push(); 出栈 s.empty(); 用于判断栈是否为空 s.sizeof(); 栈中数据多少
5. queue 队列
先进先出 排队 q.push() 入队操作 q.pop() 删除操作 q.back() front()
6. list
双向链表 提供 mylist.sort(自定义规则) 方法用于排序 插入:push_front() push_back() 删除:pop_front() push_front()
7. set
链表二叉树 ,放入set的值需要能够排序,自定义的类,需要添加排序条件 基础数据类型,会自动排序 multiset<T> 允许存放相同数据
8. map
和set类似 不同之处:map需要一个键和一个值 map<key,value> multimap<key,value> 允许存放相同键的数据 mmap.count(key) ::可以统计相同键值的数量 pair <int, int> :对组 map<int, int> m; m.insert(pair<int, int>(10,20)); m.insert(make_pair(20, 30)); m.insert(map<int, int>::value_type(30, 30)); 可以使用[]访问 赋值 m[40] = 40; m[10] = 10; //key存在会修改值 //key不存在会插入
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
vector deque 练习
给5个玩家打分,去掉最高最低求平均分,再排序 #include <iostream> #include <string> #include <deque> #include <vector> #include <algorithm> using namespace std; //玩家类 class Player { public: string mName; int mScore; public: Player() {}; Player(string name, int score) :mName(name), mScore(score) {}; }; //将玩家添加到vector容器 void addPlayer(vector<Player>& vPlayer) { string play = { "玩家" }; string name = { "ABCDE" }; for (int i = 0; i < 5; i++) { Player p(play + name[i], 0); vPlayer.push_back(p); } } //设置分数 void setScore(vector<Player>& vPlayer) { for (vector<Player>::iterator it = vPlayer.begin(); it != vPlayer.end(); it++) { deque<int> dscore; int score = 0; for (int i = 0; i < 5; i++) { score = rand() % 41 + 60; dscore.push_back(score); } //排序 去掉最高和最低分 sort(dscore.begin(),dscore.end()); dscore.pop_back(); dscore.pop_front(); int totalScore = 0; int avgScore = 0; for (deque<int>::iterator dit = dscore.begin(); dit != dscore.end(); dit++) { totalScore += *dit; } avgScore = totalScore / dscore.size(); //将平均分保存到vector (*it).mScore = avgScore; } } bool myRule(Player p1,Player p2) { return p1.mScore < p2.mScore; } //玩家排名 void mySort(vector<Player>& vPlayer) { sort(vPlayer.begin(), vPlayer.end(), myRule); for (vector<Player>::iterator it = vPlayer.begin(); it != vPlayer.end(); it++) { cout << (*it).mName << " " << (*it).mScore << endl; } } int main() { //将玩家添加到vector容器 vector<Player> vPlayer; addPlayer(vPlayer); setScore(vPlayer); mySort(vPlayer); }
list 排序
#include <iostream> #include <list> #include <string> using namespace std; class Person { public: string mName; int mAge; public: Person(string name, int age) :mName(name), mAge(age) {}; }; bool myCompare(Person& p1, Person& p2) { return p1.mAge < p2.mAge; } void Print(list<Person>& mlist) { for (list<Person>::iterator it = mlist.begin(); it != mlist.end(); it++) { cout << (*it).mName << " " << (*it).mAge << endl; } } void test02() { list<Person> list1; Person p1("A", 10), p2("B", 5), p3("C", 12); list1.push_back(p1); list1.push_back(p2); list1.push_back(p3); list1.sort(myCompare); Print(list1); list1.reverse(); //反转链表 Print(list1); } int main() { test02(); }
set 存储自定义类型
#include <iostream> #include <set> #include <string> using namespace std; class Person { public: string mName; int mAge; public : Person(string name, int age) :mName(name), mAge(age) {}; }; //自定义比较规则 class myCompare { public: bool operator()(const Person & p1,const Person& p2) { return p1.mAge < p2.mAge; } }; void Print(set<Person, myCompare>& s) { for (set<Person, myCompare>::iterator it = s.begin(); it != s.end(); it++) { cout << (*it).mName << " " << (*it).mAge << endl; } } int main() { set<Person,myCompare> s2; Person p1("A", 10), p2("B", 20), p3("C", 5); s2.insert(p1); s2.insert(p2); s2.insert(p3); Print(s2); }