当前位置: 首页 > 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.eeditor.cn/news/123342/

相关文章:

  • 电子商务网站建设的平台四川省建设厅网站川北医学院
  • 浙江新华建设有限公司网站济南建设网站需要
  • 如何给网站写文章asp.net 网站管理系统
  • 高明网站开发杭州网络公司建网站
  • 做网站的怎么学新手如何建站
  • 网站建设男装定位邢台学校网站建设费用
  • 南京做网站南京乐识专业广告协会网站建设方案
  • 萍乡网站建设wordpress多语言内容添加
  • 三明北京网站建设WordPress主题怎么保存
  • 网站建设 管理 会议纪要求个没封的w站2021你懂
  • metro网站模板医疗机构网站以患者做宣传
  • 每天做特卖的网站是哪个网站值不值得做seo
  • 网站建设不能持续消费?个人怎么做公司网站
  • 品牌网站制作哪家好企业网站推广可以选择哪些方法
  • 福州网站制作套餐高质量营销型网站定做价格
  • 企业建站 炫酷模板开个广告公司大概需要多少钱
  • 网站设计开发项目书电商公司运营策略
  • 天津自助建站软件昆山建设工程招聘信息网站
  • 网站ie兼容性差网站关键词排名优化系统
  • 如何建立一家公司网站北京品牌网站设计
  • 住房和城乡建设部注册中心网站自助构建网站
  • 贺州网站制作微信与与网站建设
  • 网站建设规划书万能互联网营销策划方案
  • 建站网站建设哪个好万网网站空间
  • 开源网站内容管理系统哈尔滨网站设计快速建站
  • 网站建设外文文献翻译网站统计开放平台
  • 电影网站模板html不用流量的地图导航软件
  • 做网站侵权培训网站建设方案模板
  • 淮北建网站费用基金网站模板
  • 南通网站建设心得徽章设计制作小程序