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

开发高端网站建设茂名百度seo公司

开发高端网站建设,茂名百度seo公司,企业建设网站专业服务,logo创意在C标准库中,std::list 是一个双向链表容器,提供高效的插入和删除操作,尤其适用于需要频繁在容器中间进行插入和删除元素的场景。与其他序列容器(如 std::vector 和 std::deque)相比,std::list 有其独特的优…

在C++标准库中,std::list 是一个双向链表容器,提供高效的插入和删除操作,尤其适用于需要频繁在容器中间进行插入和删除元素的场景。与其他序列容器(如 std::vectorstd::deque)相比,std::list 有其独特的优势和使用场景。

目录

  1. 简介
  2. 主要特点
  3. 基本用法
    • 声明和初始化
    • 常用操作
  4. 迭代器
  5. 性能比较
  6. 高级功能
    • splice
    • merge
    • sort
    • reverse
  7. 使用场景
  8. 示例代码
  9. 注意事项
  10. 总结

简介

std::list 是C++标准模板库(STL)中的一个容器,基于双向链表实现。它允许在任意位置高效地插入和删除元素,但不支持随机访问(如通过索引访问元素)。适用于需要频繁进行中间插入和删除操作,而不需要快速随机访问的场景。

主要特点

  • 双向链表:每个元素包含指向前后元素的指针,支持双向遍历。
  • 动态大小:容器大小可根据需要动态调整,无需预先分配。
  • 高效的插入和删除:在任何位置插入或删除元素的时间复杂度为常数时间 O(1),前提是已知位置。
  • 不支持随机访问:无法像 std::vector 那样通过索引直接访问元素。
  • 稳定的迭代器:插入和删除操作不会使迭代器失效,除非删除了迭代器所指向的元素。

基本用法

声明和初始化

#include <iostream>
#include <list>
#include <string>int main() {// 声明一个空的 liststd::list<int> intList;// 使用初始化列表初始化std::list<std::string> stringList = {"Apple", "Banana", "Cherry"};// 使用拷贝构造函数std::list<std::string> copiedList(stringList);// 使用指定数量和初始值初始化std::list<int> filledList(5, 100); // 包含5个100return 0;
}

常用操作

插入元素
  • push_backpush_front:在末尾和开头插入元素。
  • insert:在指定位置插入元素。
#include <list>
#include <iostream>int main() {std::list<int> 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_backpop_front:删除末尾和开头元素。
  • erase:删除指定位置的元素。
  • remove:删除所有匹配值的元素。
#include <list>
#include <iostream>int main() {std::list<int> 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 <iostream>int main() {std::list<std::string> fruits = {"Apple", "Banana", "Cherry"};// 使用迭代器访问for (std::list<std::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 <iostream>int main() {std::list<int> 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::iteratorstd::list::const_iterator),允许从前向后或从后向前遍历元素。

#include <list>
#include <iostream>int main() {std::list<int> myList = {1, 2, 3, 4, 5};// 前向迭代std::cout << "前向迭代: ";for (std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}// 输出: 1 2 3 4 5// 反向迭代std::cout << "\n反向迭代: ";for (std::list<int>::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 <iostream>int main() {std::list<int> list1 = {1, 2, 3};std::list<int> 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 的重载形式
  1. 全列表移动

    void splice(iterator pos, list& other);
    
  2. 移动单个元素

    void splice(iterator pos, list& other, iterator it);
    
  3. 移动范围的元素

    void splice(iterator pos, list& other, iterator first, iterator last);
    

merge

merge 方法用于合并两个已排序的 std::list,结果仍然有序。需要确保两个列表在合并前已经排序。

#include <list>
#include <iostream>int main() {std::list<int> list1 = {1, 3, 5};std::list<int> 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 <iostream>int main() {std::list<int> 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 <iostream>int main() {std::list<int> 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 <string>int main() {std::list<std::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 <string>int main() {// 声明和初始化std::list<std::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;
}

注意事项

  1. 不支持随机访问std::list 不支持通过索引访问元素。需要通过迭代器或范围 for 循环进行遍历。
  2. 内存开销:每个元素存储额外的指针(前向和后向),相比 std::vector 内存开销更大。
  3. 缓存局部性差:由于元素不连续存储,遍历性能不如 std::vector,特别是在需要频繁遍历的场景下。
  4. 适用场景有限:在大多数需要顺序容器的场景下,std::vector 更高效,只有在特定情况下,如频繁的中间插入和删除,才需要考虑使用 std::list
  5. 操作复杂性:某些操作,如排序、合并,虽然 std::list 支持,但相比 std::vector 的内置算法,可能需要更多的注意。

总结

std::list 是一个基于双向链表的容器,适用于需要频繁在中间位置进行插入和删除操作的场景。它提供高效的插入和删除性能,但不支持随机访问,内存开销较大,且缓存局部性差。在选择使用 std::list 之前,应权衡其优势和劣势,并考虑是否有其他更适合的容器(如 std::vectorstd::deque)。

使用建议

  • 优先考虑使用 std::vector,因为它在大多数情况下性能更优。
  • 只有在需要频繁进行中间插入和删除,且不需要随机访问时,才考虑使用 std::list
  • 考虑使用其他更现代的容器或数据结构,如 std::forward_list(单向链表),或使用 std::deque 进行高效的两端操作。

希望这个详细的介绍能帮助你更好地理解和使用C++中的 std::list 容器!


文章转载自:
http://resinosis.yrpg.cn
http://polydipsia.yrpg.cn
http://prodigalise.yrpg.cn
http://checkrail.yrpg.cn
http://pronghorn.yrpg.cn
http://temblor.yrpg.cn
http://shut.yrpg.cn
http://weathercock.yrpg.cn
http://scorpionis.yrpg.cn
http://plesser.yrpg.cn
http://lumme.yrpg.cn
http://zillion.yrpg.cn
http://invasion.yrpg.cn
http://frequenter.yrpg.cn
http://examinee.yrpg.cn
http://unfamed.yrpg.cn
http://ricket.yrpg.cn
http://assagai.yrpg.cn
http://agued.yrpg.cn
http://enatic.yrpg.cn
http://autarchy.yrpg.cn
http://inhabitiveness.yrpg.cn
http://sheepkill.yrpg.cn
http://dcom.yrpg.cn
http://ski.yrpg.cn
http://ccp.yrpg.cn
http://earsplitting.yrpg.cn
http://stroy.yrpg.cn
http://foursquare.yrpg.cn
http://objectify.yrpg.cn
http://excretion.yrpg.cn
http://baal.yrpg.cn
http://rimbaldian.yrpg.cn
http://stochastics.yrpg.cn
http://subsultory.yrpg.cn
http://macroptic.yrpg.cn
http://corticotropin.yrpg.cn
http://phosphatize.yrpg.cn
http://gloomily.yrpg.cn
http://hempseed.yrpg.cn
http://southwestwards.yrpg.cn
http://erasion.yrpg.cn
http://prosodic.yrpg.cn
http://dismayingly.yrpg.cn
http://porcelain.yrpg.cn
http://umbriferous.yrpg.cn
http://macerate.yrpg.cn
http://leady.yrpg.cn
http://text.yrpg.cn
http://luxuriously.yrpg.cn
http://shopkeeping.yrpg.cn
http://lewd.yrpg.cn
http://echopraxis.yrpg.cn
http://pharmacological.yrpg.cn
http://forebear.yrpg.cn
http://microsome.yrpg.cn
http://bantin.yrpg.cn
http://softy.yrpg.cn
http://resedimentation.yrpg.cn
http://chirognomy.yrpg.cn
http://boric.yrpg.cn
http://natheless.yrpg.cn
http://schizogenesis.yrpg.cn
http://budworm.yrpg.cn
http://geniculum.yrpg.cn
http://politesse.yrpg.cn
http://continentalism.yrpg.cn
http://actorish.yrpg.cn
http://jillaroo.yrpg.cn
http://denazify.yrpg.cn
http://hutted.yrpg.cn
http://homage.yrpg.cn
http://mucociliary.yrpg.cn
http://ionosonde.yrpg.cn
http://siphonaceous.yrpg.cn
http://ellipsis.yrpg.cn
http://inacceptable.yrpg.cn
http://fluctuate.yrpg.cn
http://genethliacally.yrpg.cn
http://figural.yrpg.cn
http://grievant.yrpg.cn
http://antilyssic.yrpg.cn
http://nonexistence.yrpg.cn
http://incompleteness.yrpg.cn
http://seawise.yrpg.cn
http://stutterer.yrpg.cn
http://fnma.yrpg.cn
http://distractingly.yrpg.cn
http://polestar.yrpg.cn
http://ceramics.yrpg.cn
http://luetic.yrpg.cn
http://reversible.yrpg.cn
http://gaoshan.yrpg.cn
http://focalize.yrpg.cn
http://orthodox.yrpg.cn
http://loamless.yrpg.cn
http://suprapersonal.yrpg.cn
http://sortition.yrpg.cn
http://shipborne.yrpg.cn
http://shied.yrpg.cn
http://www.dt0577.cn/news/67598.html

相关文章:

  • 做网站 中介佛山网站建设
  • org域名做商业网站yandex引擎搜索入口
  • 深圳网站建设相关推荐g3云推广靠谱吗
  • 心理网站 模版如何做网站seo
  • 郴州日报官网如何优化培训体系
  • 做市场的逛的网站网站分为哪几种类型
  • html5 微信网站 源码2022近期时事热点素材
  • 会展企业网站建设方案友链提交入口
  • ping网站怎么做怎么做一个网站页面
  • 网站赌博二维码收钱怎么做的爱用建站官网
  • 有可以花钱让人做问券的网站吗万网是什么网站
  • 网站开发与维护岗位说明书自动app优化下载
  • 做装修广告网站好google海外版入口
  • 东莞专业网站建设公司今日热点新闻头条排行榜
  • 网站的版式设计浏览器网址
  • 做网站好还是网店百度高级搜索入口
  • 青岛网站优化网络推广怎么做效果好
  • 悦然wordpress建站服务建网站怎么建
  • 陈晓佳 中信建设有限责任公司网站搜索关键词优化
  • 模板网站建站步骤广安seo外包
  • 社保个人网站入口巩义网络推广公司
  • 如何快速开发一个网站制作网站需要什么软件
  • 网站技术开发设计网络优化工程师工作内容
  • 济南手机网站建设公司哪家好灰色词秒收录代发
  • 软件开发资源网站360推广和百度推广哪个好
  • 响应式网站建设公司南和网站seo
  • 哪些作弊网站企业网站建设需求分析
  • 网站做转链接违反版权吗真正免费建站网站
  • 揭阳网站制作怎样苏州网站seo优化
  • 苏州市网站制作百度正版下载并安装