参考别人资料,按照抄写测试重新排序和注释
原文链接
原文链接2
摘自大佬
List 的能力List的内部结构与vector和deque完全不同,List对象提供了两个pointer,分别指向前后元素。因此,List在几个方面与vector和deuqe不同:
1.List不支持随机访问,因此访问元素的效率较低;
2.任何位置上,执行元素的插入和移除都很快,始终是常量时间内完成,因为无需移动任何元素;
3.安插和删除的 *** 作不会因此指向其他元素的pointer、reference、iterator失效;
4.List对异常的控制是,要么 *** 作成功,要么什么都不发生。
List容器提供的一般STL所具备的通用能力,但相比于vector和deque具有如下不同——
1.由于不支持随机访问,所以List没有at函数和下标 *** 作符;
2.List并未提供容量、空间重新分配等 *** 作的函数,因为没有必要,每个元素有自己的内存,在元素被删除前一直有效;
3.List提供不少特殊成员函数,专门用于移动和移除元素,较之同名的STL通用算法,这些函数执行起来更加迅速,因为他们只需要调整几个pointer即可。
声明一个空的链表
std::list <int > IList0;
建立一个有9个元素的链表,链表默认值为0
std::list <int > IList1(9);
创建一个具有5个元素的链表,默认值为1
std::list <int > IList2(5, 1);
拷贝一个链表,值为IList2
std::list <int > IList3(IList2);
建立一个链表,链表的长度为从IList2开始到++IList2.begin()终止,但不包含++IList2.begin()
std::list <int > IList4(IList2.begin() , ++IList2.begin());
添加数据
头部插入
IList0.push_front(1);
尾部插入
IList0.push_back(3);
插入
在begin前面插入
IList0.insert(IList0.begin(),0);
运行结果
头部删除
IList0.pop_front();
尾部删除
IList0.pop_back();
清空
IList0.clear();
程序示例
i = IList0.erase(i);
删除除相同元素
void remove(const Type& _Val);
自定义删除,满足条件返回true删除,否则不删除
bool marger(int & x )
{
if (x>3)
{
return true;
}
return false;
}
IList0.remove_if(marger);
重置元素
重置为5个元素,每个元素的值为5
IList0.assign(5, 5);
清空list1并且 将list0的元素从0开始到end–结束,不包含end–
IList1.assign(IList0.begin(), --IList0.end());
是否为空
为空返回true,不为空范围false
IList0.empty()
调整大小
将list的数量调整为5个 多余的删除掉,少于的则会用0补齐
IList0.resize(5);
将list的数量调整为5个 多余的删除掉,少于的则会用8补齐
IList0.resize(1, 8);
遍历
迭代器遍历
for (auto i = IList.begin(); i != IList.end(); i++)
这里没有深挖,使用底层接口遍历
#include
for_each(IList0.begin(), IList0.end(), print);
合并
自定义合并,默认不输入函数指针则从大到小,如果有函数指针则如果为true就把x放前面 否则把y放前面
bool marger(int & x,int &y )
{
if (x>y)
{
return true;
}
return false;
}
IList0.merge(IList2, marger);
从L1末尾开始添加L2,并且清空L2
L1.splice(L1.end(), L2);
从L1,末尾开始添加L0,开始添加的数据未从(++L0.begin())开始,并且清空(++L0.begin())之后的数据
L1.splice(L1.end(), L0, (++L0.begin()));
从L1的++L1.begin()开始添加L3的数据,数据的开始和 结束位置为L3.begin(), ++L3.begin();但不包括++L3.begin();并且L1的数据添加位置开始数据会向后移动,同样原理:L3的L3.begin()到++L3.begin()的数据会被移除
L1.splice(++L1.begin(), L3, L3.begin(), ++L3.begin());
排序
如果不传入函数指针默认从小到大排序,否则返回true为把x方前面,false为把y放前面
bool marger(int & x,int &y )
{
if (x>y)
{
return true;
}
return false;
}
IList0.sort(marger); //所有元素自动按从大到小排序
反转
与原来相反的顺序
IList0.reverse();
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)