C++STL第五篇(链表List的使用方法)
list
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相较于vector的连续线性空间,list就显得负责许多,它的好处是每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素的移除,list永远是常数时间。
List和vector是两个最常被使用的容器。List容器是一个双向链表。
-
采用动态存储分配,不会造成内存浪费和溢出
-
链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
-
链表灵活,但是空间和时间额外耗费较大
list容器的迭代器
List容器不能像vector一样以普通指针作为迭代器,因为其节点不能保证在同一块连续的内存空间上。List迭代器必须有能力指向list的节点,并有能力进行正确的递增、递减、取值、成员存取操作。所谓”list正确的递增,递减、取值、成员取用”是指,递增时指向下一个节点,递减时指向上一个节点,取值时取的是节点的数据值,成员取用时取的是节点的成员。
List*有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效。这在vector是不成立的,因为vector的插入操作可能造成记忆体重新配置,导致原有的迭代器全部失效,甚至List元素的删除,也只有被删除的那个元素的迭代器失效,其他迭代器不受任何影响。
list是一个循环的双向链表
list<int> myList;
for (int i = 0; i < 10; i++) {
myList.push_back(i);
}
list<int>::_Nodeptr node = myList._Myhead->_Next;
for (int i = 0; i < myList._Mysize * 2; i++) {
cout << "Node:" << node->_Myval << endl;
node = node->_Next;
if (node == myList._Myhead) {
node = node->_Next;
}
}
这是C++11标准库下的写法,list<int>::_Nodeptr node = myList._Myhead->_Next;
这句话不适用于其他版本。
构造函数
-
默认构造函数:
std::list<T> lst; // 创建一个空的列表 lst,其中 T 是列表中元素的类型。
-
区间构造函数:
std::list<T> lst(beg, end); // 将区间 `[beg, end)` 中的元素拷贝给列表 lst。
-
重复元素构造函数:
std::list<T> lst(n, elem); // 创建包含 n 个值为 elem 的元素的列表 lst。
-
拷贝构造函数:
std::list<T> lst2(lst); // 使用列表 lst 初始化列表 lst2,创建 lst 的副本。
修改操作
push_back(elem)
: 在容器尾部加入一个元素。pop_back()
: 删除容器中最后一个元素。push_front(elem)
: 在容器开头插入一个元素。pop_front()
: 从容器开头移除第一个元素。insert(pos, elem)
: 在 pos 位置插入 elem 元素的拷贝,返回新数据的位置。insert(pos, n, elem)
: 在 pos 位置插入 n 个 elem 数据,无返回值。insert(pos, beg, end)
: 在 pos 位置插入[beg, end)
区间的数据,无返回值。clear()
: 移除容器的所有数据。erase(beg, end)
: 删除[beg, end)
区间的数据,返回下一个数据的位置。erase(pos)
: 删除 pos 位置的数据,返回下一个数据的位置。remove(elem)
: 删除容器中所有与 elem 值匹配的元素。
大小
-
size();//返回容器中元素的个数
-
empty();//判断容器是否为空
-
resize(num);//重新指定容器的长度为num,
若容器变长,则以默认值填充新位置。
如果容器变短,则末尾超出容器长度的元素被删除。
- resize(num, elem);//重新指定容器的长度为num,
若容器变长,则以elem值填充新位置。
如果容器变短,则末尾超出容器长度的元素被删除。
其他
list<int> rlist = { 3,2,1,5,4 };
cout << "rlist.front:" << rlist.front() << endl;
cout << "rlist.back:" << rlist.back() << endl;
rlist.reverse();
// 使用迭代器遍历链表并输出元素
for (auto it = rlist.begin(); it != rlist.end(); ++it) {
std::cout << *it << " ";
}
rlist.sort();
本文来自博客园,作者:ivanlee717,转载请注明原文链接:https://www.cnblogs.com/ivanlee717/p/18082202
热门相关:医道至尊 神医娘亲之腹黑小萌宝 魅王毒后 99次出墙:老公,情难自禁 极品医圣