三. STL常用容器
5. stack容器
5.1 stack基本概念
stack是一种先进后出的数据结构,它只有一个出口。
栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为。
栈不支持迭代器
5.2 stack常用接口
stack<int>s; //默认构造
s.push(10); //向栈顶添加元素,叫做压栈、入栈
s.pop(); //弹出栈顶元素
s.top(); //返回栈顶
s.empty(); //判断栈是否为空
s.size(); //返回栈的大小
6. queue容器
6.1 queue基本概念
queue是一种先进先出的数据结构,它有两个出口
队列容器允许从一端新增元素,从另一端移除元素
队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为
6.2 queue常用接口
queue<Person>q; //创建队列
q.push(p1); //向队列中添加元素,入队操作,往队尾添加
//队列不提供迭代器,更不支持随机访问
q.pop(); //从队头移除第一个元素
q.back(); //返回最后一个元素
q.front(); //返回第一个元素
q.empty(); //判断队列是否为空
q.size(); //返回队列大小
7. list容器
7.1 list基本概念
功能:将数据进行链式存储
链表的组成:链表由一系列结点组成,结点由存储数据元素的数据域和存储下一个结点地址的指针域组成。
STL中的链表是一个双向循环链表
由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器。
list的优点:
1)采用动态存储分配,不会造成内存浪费和溢出;
2)执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素。
list的缺点:
1)链表灵活,但是空间(指针域)和时间(遍历)额外耗费较大
list的插入操作和删除操作都并不会造成原有list迭代器的失效,这在vector是不成立的。
总结:STL中list和vector是两个最常被使用的容器,各有优缺点
7.2 list构造函数
list<int>l1;
list<int>l2(l1.begin(),l1.end());
list<int>l3(l2);
list<int>l4(10,1000);
7.3 list赋值和交换
l2=l1;
l3.assign(l2.begin(),l2.end());
l4.assign(10,100);
l1.swap(l2); //交换
7.4 list大小和操作
l.size(); //返回容器中元素的个数
l.empty(); //判断是否为空
l.resize(num); //重新指定个数
l.resize(num,elem);
7.5 list插入和删除
l.push_back(10); //尾插
l.push_front(100); //头插
l.pop_back(); //尾删
l.pop_front(); //头删
l.insert(d.begin(),100); //返回新数据位置
list<int>::iterator it = l.begin();
l.insert(++it,1000);
it = l.begin();
l.erase(++it);
l.remove(100000); //移除容器中值为100000的数据
l.clear(); //清空
7.6 list数据存取
不支持at访问数据,不支持 [ ] 方式访问数据
list<int>::iterator it = l1.begin();
/*it = it+1; 错误,list容器的迭代器是双向迭代器,
不支持随机访问,不可以跳跃访问,即使是+1*/
7.7 list反转和排序
l.reverse(); //反转容器的元素
l.sort(); //排序,默认从小到大
bool myCompare(int val1, int val2)
{
return val1 > val2;
}
l.sort(myCompare); //从大到小排序