粗略总结记录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);
}