List容器
List简介
list是一个双向链表容器,可高效地进行插入删除元素。
list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符。
It++(ok) it+5(err)
1、#include <list>
list<int> lstInt; //定义一个存放int的list容器。
list<float> lstFloat; //定义一个存放float的list容器。
list<string> lstString; //定义一个存放string的list容器。
//尖括号内还可以设置指针类型或自定义类型。
2、list头尾的添加移除操作
list.push_back(elem); //在容器尾部加入一个元素
list.pop_back(); //删除容器中最后一个元素
list.push_front(elem); //在容器开头插入一个元素
list.pop_front(); //从容器开头移除第一个元素
3、list的数据存取
list.front(); //返回第一个元素。
list.back(); //返回最后一个元素。
4、list与迭代器
list.begin(); //返回容器中第一个元素的迭代器。
list.end(); //返回容器中最后一个元素之后的迭代器。
list.rbegin(); //返回容器中倒数第一个元素的迭代器。
list.rend(); //返回容器中倒数最后一个元素的后面的迭代器。
5、list对象的带参数构造
list(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
list(n,elem); //构造函数将n个elem拷贝给本身。
list(const list &lst); //拷贝构造函数。
6、 list.swap(lst); // 将lst与本身的元素互换。
7、list的大小
list.size(); //返回容器中元素的个数
list.empty(); //判断容器是否为空
list.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
list.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
8、list的插入
list.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
list.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
list.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
9、list的删除
list.clear(); //移除容器的所有数据
list.erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
list.erase(pos); //删除pos位置的数据,返回下一个数据的位置。
lst.remove(elem); //删除容器中所有与elem值匹配的元素。
10、list的反序排列
lst.reverse(); //反转链表,比如lst包含1,3,5元素,运行此方法后,lst就包含5,3,1元素。
11、list中的sort方法。
不支持随机访问的结构都需要重新实现sort方法。
测试Code
#include <iostream>
using namespace std;
#include <string>
#include <list>//双向循环链表
#include <algorithm>
class Person{
public:
Person(string name="",int score=0,int height = 180):
m_name(name),m_avgScore(score),m_height(height){}
void setName(string name){
m_name = name;
}
void setScore(int score){
m_avgScore = score;
}
int getScore(){
return m_avgScore;
}
//排序,优先按照分数排序,分数相同的按照年龄升序排序。
bool operator<(const Person&p){
if(this->m_avgScore == p.m_avgScore){
return this->m_height > p.m_height;
}
return this->m_avgScore>p.m_avgScore;
}
public:
string m_name;
int m_avgScore;
int m_height;
};
void myPrint(list<Person>&li){
//正向迭代
for(list<Person>::iterator it=li.begin();it!=li.end();it++){
cout<<it->m_name<<"----"<<it->m_avgScore<<"-----"<<it->m_height<<endl;
}
}
int main()
{
//1、初始化
list<Person>li;
Person p1("大娃",20,180);
Person p2("二娃",18,178);
Person p3("三娃",18,166);
Person p4("蛇精",20,189);
li.push_back(p1);
li.push_back(p2);
li.push_back(p3);
li.push_back(p4);
li.sort();
myPrint(li);
return 0;
}
Set和multiset容器
了解平衡二叉树和有序搜索树。
include<set>
1、
set/multiset对象的默认构造
set<int> setInt; //一个存放int的set容器。
set<float> setFloat; //一个存放float的set容器。
set<string> setString; //一个存放string的set容器。
multiset<int> mulsetInt; //一个存放int的multi set容器。
multi set<float> multisetFloat; //一个存放float的multi set容器。
multi set<string> multisetString; //一个存放string的multi set容器。
2、set的插入与迭代器
set.insert(elem); //在容器中插入元素。 set.begin(); //返回容器中第一个数据的迭代器。
set.end(); //返回容器中最后一个数据之后的迭代器。
set.rbegin(); //返回容器中倒数第一个元素的迭代器。
set.rend(); //返回容器中倒数最后一个元素的后面的迭代器。
set.rbegin()与set.rend()。略。
3、Set集合的元素排序
set<int,less<int> > setIntA; //该容器是按升序方式排列元素。
set<int,greater<int>> setIntB; //该容器是按降序方式排列元素。
set<int> 相当于 set<int,less<int>>。
less<int>与greater<int>中的int可以改成其它类型,该类型主要要跟set容纳的数据类型一致。
4、set对象的拷贝构造与赋值
set(const set &st); //拷贝构造函数
set& operator=(const set &st); //重载等号操作符
set.swap(st); //交换两个集合容器
5、set的删除
set.clear(); //清除所有元素
set.erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
set.erase(beg,end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
set.erase(elem); //删除容器中值为elem的元素。
6、set的查找
set.find(elem); //查找elem元素,返回指向elem元素的迭代器。
set.count(elem); //返回容器中值为elem的元素个数。对set来说,要么是0,要么是1。对multiset来说,值可能大于1。
set.lower_bound(elem); //返回第一个>=elem元素的迭代器。
set.upper_bound(elem); // 返回第一个>elem元素的迭代器。
set.equal_range(elem); //返回容器中与elem相等的上下两个元素的迭代器。
7、pair的使用
pair译为对组,可以将两个值视为一个单元。
pair<T1,T2>存放的两个值的类型,可以不一样,如T1为int,T2为float。T1,T2也可以是自定义类型。
pair.first是pair里面的第一个值,是T1类型。
pair.second是pair里面的第二个值,是T2类型。
Map
使用场景
Vector的使用场景:比如软件历史操作记录的存储,我们经常要查看历史记录,比如上一次的记录,上上次的记录,但却不会去删除记录,因为记录是事实的描述。
deque的使用场景:比如排队购票系统,对排队者的存储可以采用deque,支持头端的快速移除,尾端的快速添加。如果采用vector,则头端移除时,会移动大量的数据,速度慢。
list的使用场景:比如公交车乘客的存储,随时可能有乘客下车,支持频繁的不确实位置元素的移除插入。
set的使用场景:比如对手机游戏的个人得分记录的存储,存储要求从高分到低分的顺序排列。
map的使用场景:比如按ID号存储十万个用户,想要快速要通过ID查找对应的用户。二叉树的查找效率,这时就体现出来了。如果是vector容器,最坏的情况下可能要遍历完整个容器才能找到该用户。