当前位置: 首页 > news >正文

汽车网有哪些网站大全网站改版 更换服务器 排名丢失

汽车网有哪些网站大全,网站改版 更换服务器 排名丢失,住房城乡建设网站查询,有哪些企业公司在C标准库中#xff0c;std::list 是一个双向链表容器#xff0c;提供高效的插入和删除操作#xff0c;尤其适用于需要频繁在容器中间进行插入和删除元素的场景。与其他序列容器#xff08;如 std::vector 和 std::deque#xff09;相比#xff0c;std::list 有其独特的优…在C标准库中std::list 是一个双向链表容器提供高效的插入和删除操作尤其适用于需要频繁在容器中间进行插入和删除元素的场景。与其他序列容器如 std::vector 和 std::deque相比std::list 有其独特的优势和使用场景。 目录 简介主要特点基本用法 声明和初始化常用操作 迭代器性能比较高级功能 splicemergesortreverse 使用场景示例代码注意事项总结 简介 std::list 是C标准模板库STL中的一个容器基于双向链表实现。它允许在任意位置高效地插入和删除元素但不支持随机访问如通过索引访问元素。适用于需要频繁进行中间插入和删除操作而不需要快速随机访问的场景。 主要特点 双向链表每个元素包含指向前后元素的指针支持双向遍历。动态大小容器大小可根据需要动态调整无需预先分配。高效的插入和删除在任何位置插入或删除元素的时间复杂度为常数时间 O(1)前提是已知位置。不支持随机访问无法像 std::vector 那样通过索引直接访问元素。稳定的迭代器插入和删除操作不会使迭代器失效除非删除了迭代器所指向的元素。 基本用法 声明和初始化 #include iostream #include list #include stringint main() {// 声明一个空的 liststd::listint intList;// 使用初始化列表初始化std::liststd::string stringList {Apple, Banana, Cherry};// 使用拷贝构造函数std::liststd::string copiedList(stringList);// 使用指定数量和初始值初始化std::listint filledList(5, 100); // 包含5个100return 0; }常用操作 插入元素 push_back 和 push_front在末尾和开头插入元素。insert在指定位置插入元素。 #include list #include iostreamint main() {std::listint myList {1, 2, 3};// 在末尾插入myList.push_back(4); // {1, 2, 3, 4}// 在开头插入myList.push_front(0); // {0, 1, 2, 3, 4}// 在指定位置插入auto it myList.begin();it; // 指向1myList.insert(it, 100); // {0, 100, 1, 2, 3, 4}// 输出列表内容for (const auto num : myList) {std::cout num ;}// 输出: 0 100 1 2 3 4return 0; }删除元素 pop_back 和 pop_front删除末尾和开头元素。erase删除指定位置的元素。remove删除所有匹配值的元素。 #include list #include iostreamint main() {std::listint myList {0, 100, 1, 2, 3, 4};// 删除末尾元素myList.pop_back(); // {0, 100, 1, 2, 3}// 删除开头元素myList.pop_front(); // {100, 1, 2, 3}// 删除特定元素通过迭代器auto it myList.begin();it; // 指向1myList.erase(it); // {100, 2, 3}// 删除所有值为100的元素myList.remove(100); // {2, 3}// 输出列表内容for (const auto num : myList) {std::cout num ;}// 输出: 2 3return 0; }访问元素 由于 std::list 不支持随机访问因此不能使用下标操作符 []。可以使用迭代器或范围 for 循环访问元素。 #include list #include iostreamint main() {std::liststd::string fruits {Apple, Banana, Cherry};// 使用迭代器访问for (std::liststd::string::iterator it fruits.begin(); it ! fruits.end(); it) {std::cout *it ;}// 输出: Apple Banana Cherry// 使用范围 for 循环for (const auto fruit : fruits) {std::cout fruit ;}// 输出: Apple Banana Cherryreturn 0; }修改元素 #include list #include iostreamint main() {std::listint numbers {1, 2, 3, 4, 5};// 修改所有元素for (auto num : numbers) {num * 10; // {10, 20, 30, 40, 50}}// 输出修改后的列表for (const auto num : numbers) {std::cout num ;}// 输出: 10 20 30 40 50return 0; }迭代器 std::list 提供双向迭代器std::list::iterator 和 std::list::const_iterator允许从前向后或从后向前遍历元素。 #include list #include iostreamint main() {std::listint myList {1, 2, 3, 4, 5};// 前向迭代std::cout 前向迭代: ;for (std::listint::iterator it myList.begin(); it ! myList.end(); it) {std::cout *it ;}// 输出: 1 2 3 4 5// 反向迭代std::cout \n反向迭代: ;for (std::listint::reverse_iterator rit myList.rbegin(); rit ! myList.rend(); rit) {std::cout *rit ;}// 输出: 5 4 3 2 1return 0; }性能比较 std::list vs std::vector 特性std::liststd::vector随机访问不支持支持 O(1) 时间复杂度插入/删除中间插入/删除 O(1)已知位置中间插入/删除 O(n)插入/删除末尾O(1)平均 O(1)摊销内存使用每个元素需要额外的指针更紧凑元素连续存储缓存局部性差良好连续存储提高缓存命中率遍历线性时间线性时间缓存友好空间效率较低较高 选择建议 使用 std::list 需要频繁在容器中间插入和删除元素。不需要随机访问元素。需要稳定的迭代器不希望插入/删除操作导致迭代器失效。 使用 std::vector 需要快速随机访问元素。插入和删除操作主要在末尾进行。更好的缓存性能提高遍历效率。 高级功能 splice splice 方法用于在两个 std::list 之间移动元素无需复制或移动元素本身效率极高。 #include list #include iostreamint main() {std::listint list1 {1, 2, 3};std::listint list2 {4, 5, 6};// 将 list2 的所有元素移动到 list1 的末尾list1.splice(list1.end(), list2);// list1: {1, 2, 3, 4, 5, 6}// list2: {}// 输出 list1std::cout list1: ;for (const auto num : list1) {std::cout num ;}std::cout \nlist2: ;for (const auto num : list2) {std::cout num ;}return 0; }splice 的重载形式 全列表移动 void splice(iterator pos, list other);移动单个元素 void splice(iterator pos, list other, iterator it);移动范围的元素 void splice(iterator pos, list other, iterator first, iterator last);merge merge 方法用于合并两个已排序的 std::list结果仍然有序。需要确保两个列表在合并前已经排序。 #include list #include iostreamint main() {std::listint list1 {1, 3, 5};std::listint list2 {2, 4, 6};// 合并并排序list1.merge(list2);// list1: {1, 2, 3, 4, 5, 6}// list2: {}// 输出 list1std::cout Merged list1: ;for (const auto num : list1) {std::cout num ;}return 0; }sort sort 方法对 std::list 中的元素进行排序。由于 std::list 是链表结构不支持快速随机访问内部使用归并排序算法时间复杂度为 O(n log n)。 #include list #include iostreamint main() {std::listint numbers {4, 2, 5, 1, 3};// 排序numbers.sort();// 输出排序后的列表for (const auto num : numbers) {std::cout num ;}// 输出: 1 2 3 4 5return 0; }reverse reverse 方法用于反转 std::list 中的元素顺序。 #include list #include iostreamint main() {std::listint numbers {1, 2, 3, 4, 5};// 反转numbers.reverse();// 输出反转后的列表for (const auto num : numbers) {std::cout num ;}// 输出: 5 4 3 2 1return 0; }使用场景 std::list 适用于以下场景 频繁在中间插入和删除元素如实现队列、双端队列deque等数据结构。需要稳定的迭代器插入和删除操作不会使其他迭代器失效。不需要随机访问主要进行顺序访问和操作。 示例实现一个任务队列频繁添加和移除任务。 #include list #include iostream #include stringint main() {std::liststd::string taskQueue;// 添加任务taskQueue.push_back(Task 1);taskQueue.push_back(Task 2);taskQueue.push_back(Task 3);// 插入一个高优先级任务taskQueue.push_front(High Priority Task);// 处理任务while (!taskQueue.empty()) {std::cout Processing: taskQueue.front() std::endl;taskQueue.pop_front();}return 0; }示例代码 下面是一个综合示例展示 std::list 的各种操作。 #include iostream #include list #include stringint main() {// 声明和初始化std::liststd::string fruits {Apple, Banana, Cherry};// 插入元素fruits.push_back(Date);fruits.push_front(Apricot);auto it fruits.begin();std::advance(it, 2); // 指向第三个元素fruits.insert(it, Blueberry); // 在第三个元素前插入// 输出当前列表std::cout Fruits list: ;for (const auto fruit : fruits) {std::cout fruit ;}std::cout std::endl;// 输出: Fruits list: Apricot Apple Blueberry Banana Cherry Date // 删除元素fruits.remove(Banana); // 删除所有Banana// 使用迭代器删除it fruits.begin();it; // 指向第二个元素fruits.erase(it); // 删除第二个元素// 输出修改后的列表std::cout After deletion: ;for (const auto fruit : fruits) {std::cout fruit ;}std::cout std::endl;// 输出: After deletion: Apricot Blueberry Cherry Date // 排序fruits.sort();std::cout After sorting: ;for (const auto fruit : fruits) {std::cout fruit ;}std::cout std::endl;// 输出: After sorting: Apricot Blueberry Cherry Date // 反转fruits.reverse();std::cout After reversing: ;for (const auto fruit : fruits) {std::cout fruit ;}std::cout std::endl;// 输出: After reversing: Date Cherry Blueberry Apricot // 清空列表fruits.clear();std::cout After clearing, size: fruits.size() std::endl;// 输出: After clearing, size: 0return 0; }注意事项 不支持随机访问std::list 不支持通过索引访问元素。需要通过迭代器或范围 for 循环进行遍历。内存开销每个元素存储额外的指针前向和后向相比 std::vector 内存开销更大。缓存局部性差由于元素不连续存储遍历性能不如 std::vector特别是在需要频繁遍历的场景下。适用场景有限在大多数需要顺序容器的场景下std::vector 更高效只有在特定情况下如频繁的中间插入和删除才需要考虑使用 std::list。操作复杂性某些操作如排序、合并虽然 std::list 支持但相比 std::vector 的内置算法可能需要更多的注意。 总结 std::list 是一个基于双向链表的容器适用于需要频繁在中间位置进行插入和删除操作的场景。它提供高效的插入和删除性能但不支持随机访问内存开销较大且缓存局部性差。在选择使用 std::list 之前应权衡其优势和劣势并考虑是否有其他更适合的容器如 std::vector 或 std::deque。 使用建议 优先考虑使用 std::vector因为它在大多数情况下性能更优。只有在需要频繁进行中间插入和删除且不需要随机访问时才考虑使用 std::list。考虑使用其他更现代的容器或数据结构如 std::forward_list单向链表或使用 std::deque 进行高效的两端操作。 希望这个详细的介绍能帮助你更好地理解和使用C中的 std::list 容器
http://www.hkea.cn/news/14275272/

相关文章:

  • 云南做网站报价自己制作宣传图片
  • 电子商务网站建设作业总结ssl外贸网站
  • 媒体网站网页设计无锡地区网站制作公司排名
  • 电子商务网站建设合同样本wordpress zhuce邮件
  • 代刷网站推广免费怎么查询二级建造师注册情况
  • 绍兴市交通建设检测中心网站做棋牌网站违法
  • 做网站如何提需求惠州专业网站设计公司
  • 怎样用FW做网站的首页网页小游戏在线玩4399
  • 浙江台州网络设计网站wordpress 文件上传漏洞
  • 一家只做t恤的网站注册一个域名需要多少钱
  • 建设银行手机银行银行下载官方网站asp网站图片轮播代码
  • 北京网站建设价对网站建设 意见和建议
  • 长治网站制作怎么做phpcms网站logo
  • 新网网站建设资料营销网络是什么
  • 赵县网站建设公司企业网页建设公司怎样收费
  • 免费网站制作 最好wordpress 调用分类名称
  • 计算机网站建设体会建设银行昆山分行网站
  • 设计师a 网站cms网站群管理系统
  • 微信网站流程山西建设机械网站
  • 提供网站建设方案ppt网络营销网站建设与策划分析
  • 网站源码在哪里厦门公司注册程序注册程序
  • 北京南站附近景点住房和城乡建设部官网
  • 博物馆网站建设必要网站建设添加文件夹在哪
  • 新版织梦腾讯3366小游戏门户网站模板源码网页模板的扩展名
  • 庆阳做网站的公司做seo网站推广价格
  • wordpress基础开发教程余姚seo智能优化
  • 网站建设的swot分析品牌网站建设公司有哪些
  • 住房和城乡建设厅安全员证不错宁波seo公司
  • 教做高级料理的网站山东青岛网站设计公司
  • 济南地产行业网站开发企业网站建设立项报告