STL之list(链表),set(集合),map(图)容器

因为这些容器之间都是想通的,之前博主也已经讲了很多了,所以在这里就只展示一下个个容器的接口,和不同之处。

list

在这里插入图片描述链表非连续的储存结构,相比于数组,链表插入和删除快,不会造成空间的浪费,但查询慢。

list接口

这些接口不一定都要记住,用的时候体会一下就好了

  • 1.赋值: = 或 assign(n,ele)//将n个ele付给本身
  • 2.交换:swap(stl) 两个容器元素互换
  • 3.查看容器大小: size()
  • 4.查看容器是否为空:empty()
  • 5.重新指定容器大小:resize(n,ele) ele为默认填充元素,不填为默认0
  • 6.链表尾部插入元素:push_back(ele)
  • 7.链表尾部删除元素:pop_back()
  • 8.链表首部插入元素:push_front(ele)
  • 9.链表首部删除元素:pop_front()
  • 10指定位置插入元素:insert(post,ele) 注意此处pos为迭代器 例
list<int>::iterator iter = p.begin();
	p.insert(iter, 10);
  • 11.移除链表所有元素:clear()
  • 12.移除指定位置元素:erase(pos) 注意此处pos为迭代器
  • 13.移除指定元素节点:remove(ele) 删除与ele相同的所有元素
  • 14.取出链表第一个元素::front()
  • 15.取出链表最后一个元素:back()
  • 16.将元素中元素反转:reverse()
  • 17.链表排序:sort() //将元素从小到大排序
    排序再讲一下如果我们想从大到小排序,或者元素是个对象是该怎么排序呢?
    这时就要用到自己写的Bool类型的函数放到sort中了(我也不知道怎么讲看一下代码就懂了)
#include<iostream>
#include<string>
#include<list>

using namespace std;
class Person {
public:
	Person(string name, int age) {
		this->name = name;
		this->age = age;
	}
	string name;
	int age;
};

void print(list<Person>p) {
	for (list<Person>::iterator iter = p.begin(); iter != p.end(); iter++) {
		cout << "姓名为 " << iter->name << " 年龄 " << iter->age << endl;
	}
}
//重点看这里
bool Mycompare(const Person& p1, const Person& p2) {//指定排序规则
	return p1.age > p2.age;

}
int main() {
	list<Person>p;
	Person p1("老王", 20);
	Person p2("老李", 30);
	Person p3("老冯", 40);
	Person p4("老马", 50);
	Person p5("老哥", 10);
	p.push_back(p1);
	p.push_back(p2);
	p.push_back(p3);
	p.push_back(p4);
	p.push_back(p5);
	p.sort(Mycompare);
	print(p);
}

在这里插入图片描述

set

set元素不允许出现相同元素,里面所有元素都会自动排序(通过二叉树实现)。当然如果想出现相同元素可以使用 multiset 容器

set容器

接口都差不多,这里主要讲三点。

  • 查找该元素是否存在: find()
    存在返回该元素的迭代器,不存在返回x.end()
  • 查找该元素个数:cout()
  • 因为不允许元素重复,所以只能为0或1 set容器中所有元素都会排序,那元素是对象时该怎么排序,该如何自定义排序。
    这时就要使用仿函数了,在定义set容器时,写入其参数列表
    如下
#include<iostream>
#include<string>
#include<set>
using namespace std;
class Person {
public:
	Person(string name,int age) {
		this->name = name;
		this->age = age;
	}
	string name;
	int age;
};
//重写排序规则, 仿函数重点
class Mycompare {
public:
	bool operator()( const Person &v1, const Person& v2) const {//仿函数改变排序规则,从大到小
		return v1.age > v2.age;
	}
};
void print(set<Person, Mycompare>& s) {
	for (set<Person, Mycompare>::iterator iter = s.begin(); iter != s.end(); iter++)
	{
		cout << "姓名为 " <<iter->name<<" 年龄 "<<iter->age<< endl;
	}
}
void test() {
	//集合默认是按从小到大排序,因为自定义类型没法排序,所以必须重写排序规则。
	set<Person, Mycompare>s;//须将仿函数放入模板参数列表
	Person p1("老王",20);
	Person p2("老李", 30);
	Person p3("老冯",40);
	Person p4("老马", 50);
	Person p5("老哥", 10);

	s.insert(p1);
	s.insert(p2);
	s.insert(p3);
	s.insert(p4);
	s.insert(p5);
	print(s);

}
int main() {
	test();
}

对组

pair<T,T> p=make_pair(T x,T,y)

在这里顺便讲一下对组
可以用来返回来两个变量

pair<int, string> test() {
	pair<int, string> p = make_pair(20, "秃头"); //创建对组,可以返回两个变量
	return p;
}
pair<int, string> p = test();
	cout << "姓名 " << p.second << " 年龄" << p.first;

在这里插入图片描述

map

map所有元素都是pair型
pair中第一个是key(键值),第二个是value(实值)
map容器中可以通过key快速找到value

map接口

因为基本都差不多我只讲一个插入

  • 插入 : insert(ele)
map<T,T> m;
m.insert(make_pair(T x,T y) );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值