C++容器-list、set、map

一、list容器

1、list基本概念
list(链表)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。

链表由结点构成,结点之间是独立的,由数据域和指针域构成。
优点:链表可以对任意位置进行快速插入和删除元素,采用动态存储分配,不会造成内存的浪费和溢出。
缺点:容器遍历速度,没有数组快,且占用空间比数组大。

在STL中,链表是一个双向循环链表。
由于链表的存储方式并不是连续的内存空间, 因此链表list中的迭代器只支持前移和后移,属于双向迭代器。

2、list构造函数

list<T> lst;
list(beign, end);
list(n, elem);
list(const list &lst);

3、list赋值和交换

assign(begin, end);
assign(n, elem);
list & operator=(const list & lst);
swap(lst);

4.list大小操作

size(); //返回容器中元素个数
empty(); //判断容器中是否为空
resize(num); //重新指定长度,变长则以默认值填充
resieze(num, elem) //重新指定长度,变长则以elem填充

5、list插入和删除

push_back(elem); //在容器尾部加入一个元素
pop_back(); //删除容器中最后一个元素
push_front(elem); //在容器开头插入一个元素
pop_front(); //在容器开头删除第一个元素
insert(pos,elem); //在pos位置插elem元素的拷贝,返回新数据的位置
insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值
insert(pos,begin,end); //在pos位置插入[beg,end)区间的数据,无返回值
clear(); //移除容器的所有数据
erase(begin,end); //删除[beg ,end)区间的数据,返回下一个元素的位置
erase(pos); //删除pos位置的数据,返回下一个数据的位置
remove(elem); //删除容器中所有与elem值匹配的元素

6、list数据存取

front(); //返回第一个元素
back(); //返回最后一个元素

list不支持其他数据结构中的[ ]及at操作,因为不是连续的内存空间。

7、list反转和排序
将容器中的元素反转,以及将容器中的数据进行排序。

reverse(); //反转链表
sort(); //链表排序

其中有一点需要注意,所有不支持随机访问迭代器的容器,不可以用标准算法。不支持随机访问迭代器的容器内部会提供对应的算法(即不能用全局函数,要用成员函数),如L1.sort()
sort默认为升序排序,如果想降序排序,需要构造函数来完成

list<int>L1;
...........//省略赋值操作
void mycompare(int v1, int v2)
{
	return v1 > v2;
}
L1.sort(mycompare)

二、set/multiset容器

所有元素都会在插入时自动被排序,属于关联式容器,低层结构是用二叉树实现。

set和multiset区别:

  • set不允许容器中有重复的元素
  • multiset允许容器中有重复的元素

1、set构造和赋值

构造:

set<T> st; //默认构造函数
set<const set &st>; //拷贝构造函数

赋值:

set& operator=(const set &st); //重载等号操作符

2、set大小和交换

size(); //返回容器中元素数目
empty(); //判断容器是否为空
swap(); //交换两个集合容器

3、set插入和删除

insert(elem); //在容器中插入元素
clear(); //清除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(begin, end); //删除区间[begin, end)的所有元素,返回下一个元素的迭代器
erase(elem); //删除容器中值为elem的元素

4、set查找和统计

find(key); //查找key是否存在,若存在,返回该键元素的迭代器;若不存在,返回set.end();
count(key); //统计key的元素个数

5、set和multiset的区别
区别:

  • set不可以插入重复元素,而multiset可以
  • set插入数据的同时会返回插入结果,表示插入是否成功
  • multiset不会检测数据,因此可以插入重复数据

6、pair对组创建

成对出现的数据,利用对组可以返回两个数据。
创建方式:

pair(type, type) p (value1, value2);
pair(type, type) p = make_pair(value1, value2);

p.first; //取出第一个数据
p.second; //取出第二个数据

7、set容器排序

set容器默认排序规则为从小到大,利用仿函数,可以改变排序规则。

class MyCompare(int v1, int v2)
{
public:
	bool operator()(int v1, int v2)
	{
	return v1 > v2;
	}
}
// 定义好排序顺序后,在创建set容器时就先改变排序顺序

set<int, MyCompare> s;

三、map/multimap容器

1、map基本概念

map中所有元素都是pair,第一个元素为key,起到索引作用,第二个元素为value,所有元素都会根据元素的键值自动排序。
本质:map/multimap属于关联式容器,低层结构是用二叉树实现
优点:可以根据key值快速找到value值
map与multimap区别:map不允许容器中有重复key值元素,multimap允许重复。

2、map构造和赋值
构造:

map<T1, T2> mp; //map默认构造函数
map(const map &mp); //拷贝构造函数

3、map大小和交换

size(); //返回容器中元素的数目
empty(); //判断容器是否为空
swap(); //交换两个集合容器

4、map插入和删除

insert(elem); //在容器中插入元素
clear(); //清楚所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(begin, end); //删除区间[beg, end)的所有元素,返回下一个元素的迭代器
erase(key); //删除容器中值为key的元素

5、map查找和统计

find(key); //查找key是否存在
count(); //统计key的元素个数

6、map容器排序

map容器默认排序规则为按照key值进行从小到大排序,利用仿函数,可以改变排序规则,具体做法同之前容器。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值