C++ STL记录

粗略总结记录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);
}
上一篇:c++ vector 实战(基本使用)


下一篇:codeforces1468A LaIS