1、list基本概念
list(链表)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。
链表由结点构成,结点之间是独立的,由数据域和指针域构成。
优点:链表可以对任意位置进行快速插入和删除元素,采用动态存储分配,不会造成内存的浪费和溢出。
缺点:容器遍历速度,没有数组快,且占用空间比数组大。
在STL中,链表是一个双向循环链表。
由于链表的存储方式并不是连续的内存空间, 因此链表list中的迭代器只支持前移和后移,属于双向迭代器。
2、list构造函数
listlst; 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二、set/multiset容器L1; ...........//省略赋值操作 void mycompare(int v1, int v2) { return v1 > v2; } L1.sort(mycompare)
所有元素都会在插入时自动被排序,属于关联式容器,低层结构是用二叉树实现。
set和multiset区别:
set不允许容器中有重复的元素multiset允许容器中有重复的元素
1、set构造和赋值
构造:
setst; //默认构造函数 set ; //拷贝构造函数
赋值:
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 s;
三、map/multimap容器
1、map基本概念
map中所有元素都是pair,第一个元素为key,起到索引作用,第二个元素为value,所有元素都会根据元素的键值自动排序。
本质:map/multimap属于关联式容器,低层结构是用二叉树实现
优点:可以根据key值快速找到value值
map与multimap区别:map不允许容器中有重复key值元素,multimap允许重复。
2、map构造和赋值
构造:
mapmp; //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值进行从小到大排序,利用仿函数,可以改变排序规则,具体做法同之前容器。



