网站登录页面空白,手机免费网站空间,seo5,网站整体策划与设计目录
一、list的介绍及使用
1.1 list的介绍
1.2 list的使用
1.2.1 list的构造
1.2.2 iterator的使用
1.2.3capacity#xff08;容量相关#xff09;
1.2.4 element access#xff08;元素访问#xff09;
1.2.5 modifiers#xff08;链表修改#xff09;…目录
一、list的介绍及使用
1.1 list的介绍
1.2 list的使用
1.2.1 list的构造
1.2.2 iterator的使用
1.2.3capacity容量相关
1.2.4 element access元素访问
1.2.5 modifiers链表修改
1.2.6 operation对链表的一些操作
二、从功能角度迭代器分类 博客主页C-SDN花园GGbond ⏩ 文章专栏玩转c 一、list的介绍及使用
1.1 list的介绍 1.1 list的介绍 list 是可以在常数范围内在任意位置进行插入和删除的序列式容器并且该容器可以前后双向迭代。 list 的底层是双向链表结构双向链表中的每个元素存储在互不相关的独立节点中在节点中通过指针指向的前一个元素和后一个元素。 list 和 forward_list 非常相似最主要的不同在于 forward_list 是单链表只能朝前迭代已让其更简单高效。 与其它的序列式容器相比arry、vector、dequelist 通常在任意位置进行插入移除元素的执行效率更好。 与其它序列式容器相比list 和 forward_list 最大的缺陷是不支持任意位置的随机访问比如要访问 list 的第 5 个元素必须从已知的位置比如头部或者尾部迭代到该位置在这段位置上迭代需要线性的时间开销list 还需要一些额外的空间已保存每个节点的相关联信息。 1.2 list的使用
list文档 list 在实际中非常重要在实际中我们熟悉常用的接口就可以下面列出了需要我们重点掌握的接口。
1.2.1 list的构造 size_type 表示一个无符号整数类型value_type 是 list 的第一个模板参数也就是要存储的数据类型。使用迭代器区间的构造函数是函数模板只要是满足 Input 类型的迭代器都可以使用该构造函数。
1.2.2 iterator的使用 注意begin 与 end 为正向迭代器对迭代器执行 操作迭代器向后移动。rbegin 与 rend 为反向迭代器对迭代器执行 操作迭代器向前移动。由于 list 的底层物理空间并不连续所以 list 的迭代器不再是原生指针并且 list 的迭代器没有对 和 - 进行重载只重载了 和 – 因为空间不连续重载 会比较复杂。即 l.begin() 5 是不被允许的。 #includeiostream
using namespace std;
#includelist
void print_list(listint lt)
{listint::iterator it lt.begin();// 用迭代器方式打印l2中的元素while (it ! lt.end()){cout *it ;it;}cout endl;for (int e : lt) // C11范围for的方式遍历{cout e ;}cout endl;//反向迭代器listint::reverse_iterator rit lt.rbegin();while (rit ! lt.rend()){cout *rit ;rit;}cout endl;
}
void TestList1()
{listint l1; // 构造空的l1listint l2(4, 100);// l2中放4个值为100的元素listint l3(l2.begin(), l2.end());// 用l2的[begin(), end()左闭右开的区间构造l3listint l4(l3);// 用l3拷贝构造l4int arr[] { 1,2,3,4,5,6 };listint l5(arr, arr sizeof(arr) / sizeof(arr[0])); // 以数组为迭代器区间构造l5listint l6{ 9,8,7,6 };// 列表格式初始化C11print_list(l1);print_list(l2);print_list(l3);print_list(l4);print_list(l5);print_list(l6);
}int main()
{TestList1();return 0;
} 1.2.3capacity容量相关 void TestList2()
{listint l1; // 构造空的l1listint l2(4, 100);// l2中放4个值为100的元素cout l1.size() endl;cout l2.size()endl;}
int main()
{TestList2();return 0;
} 1.2.4 element access元素访问 1.2.5 modifiers链表修改 insert 插入元素并不会导致迭代器失效例如相较于 vector 中的 insertlist 中的 insert 并不会去扩容挪动数据而 vector 中的 insert 可能会进行扩容挪动数据最终导致迭代器失效。list 中的删除元素接口会导致迭代器失效失效的只有指向被删除节点的迭代器其他迭代器不会受到影响。
void TestList3()
{listint l1; // 构造空的l1listint l2(4, 100);// l2中放4个值为100的元素cout l1.size() endl;cout l2.size()endl;l1.push_front(22);l1.push_front(11);print_list(l1);l2.insert(l2.begin(), 99);print_list(l2);listint::iterator it l2.begin();int k 3;while (k--){it;}l2.insert(it, 0);print_list(l2);l2.clear();print_list(l2);cout **********************;
}
int main()
{TestList3();return 0;
} 1.2.6 operation对链表的一些操作 splice() 函数主要用于在列表中进行元素的转移操作。 它可以将一个列表中的部分或全部元素转移到另一个列表中。可以指定要转移的元素范围以及目标插入位置等实现了高效灵活的元素移动和重组。 remove函数相当于一直遍历列表然后erase删除指定元素。 unique 函数主要用于移除列表中相邻的重复元素。它使得容器中只保留不重复的元素序列但需要注意的是它并不保证完全去除所有重复元素只是处理相邻的重复项通常也需要结合其他操作来实现完全去重。 merge()函数主要用于将两个已排序的序列合并成一个新的已排序序列。 它会按照排序顺序将一个序列中的元素与另一个序列中的元素合理地组合在一起形成一个合并后的有序序列。需要注意的是在合并之前两个源序列本身需要是已经排序好的。 链表逆置可以使用 list 自身的接口也可以使用算法库中的 reverse二者没有什么区别。链表排序只能使用 list 自身的 sort() 接口底层是利用归并排序不能使用算法库的 sort因为算法库中的 sort 底层是通过快排来实现的而快排中会涉及到三数取中需要迭代器 - 迭代器链表不能很好的支持。虽然链表提供了排序接口但是用链表对数据排序意义不大效率太低了更希望用 vector 来对数据进行排序。 二、从功能角度迭代器分类
迭代器类型功能单向InputIterator支持 双向BidirectionalItreator支持 /- -随机RandomAccessIterator支持 / - - / / -
其中 forward_list、unordered_xxx 都是单向迭代器list、map、set 都是双向迭代器vector、string、deque 都是随机迭代器。对迭代器的这种分类方式是由容器的底层结构来决定的。
算法库中也有一个sort()函数但是其支持的是随机迭代器而list是一种双向迭代器所以list无法调用算法库中的sort()。