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

深入理解C++ 容器类

承接Qt/C++软件开发项目,高质量交付,灵活沟通,长期维护支持。需求所寻,技术正适,共创完美,欢迎私信联系!

引言

        C++ 标准库提供了丰富的容器(container)类型,用于存储和管理数据。这些容器不仅简化了编程工作,还提供了高效的数据管理和操作方法。本文将详细介绍 C++ 中常见的标准容器类,包括顺序容器、关联容器以及无序关联容器,并探讨它们的特点、使用场景及性能表现。

1. 顺序容器(Sequence Containers)

        顺序容器是按照插入顺序存储元素的容器。它们支持随机访问、前向迭代和后向迭代。主要的顺序容器有 std::vector、std::deque、std::list 和 std::forward_list。

1.1 std::vector

  • 特点:动态数组,支持快速随机访问。
  • 优点:
    • 连续内存分配,访问速度快。
    • 支持高效的尾部插入和删除操作。
  • 缺点:插入或删除中间元素效率较低,因为需要移动其他元素。
  • 适用场景:当你需要快速访问和频繁在尾部插入/删除元素时。
  • 示例代码:
#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};vec.push_back(6); // 尾部插入for (const auto& elem : vec) {std::cout << elem << " ";}return 0;
}

1.2 std::deque(双端队列)

  • 特点:两端都可以高效地插入和删除元素。
  • 优点:
    • 支持快速的前端和尾端插入/删除操作。
    • 内存块不连续,但对用户透明。
  • 缺点:随机访问比 std::vector 慢。
  • 适用场景:需要频繁在两端进行插入和删除操作。
  • 示例代码: 
#include <iostream>
#include <deque>int main() {std::deque<int> dq = {1, 2, 3};dq.push_front(0); // 前端插入dq.push_back(4);  // 尾部插入for (const auto& elem : dq) {std::cout << elem << " ";}return 0;
}

1.3 std::list(双向链表)

  • 特点:双向链表,支持快速的任意位置插入和删除。
  • 优点:插入和删除操作的时间复杂度为 O(1),前提是已有迭代器指向插入点。
  • 缺点:随机访问效率低。
  • 适用场景:需要频繁在任意位置插入和删除元素。
  • 示例代码:
#include <iostream>
#include <list>int main() {std::list<int> lst = {1, 2, 3};lst.insert(lst.begin(), 0); // 在开头插入lst.push_back(4);           // 在结尾插入for (const auto& elem : lst) {std::cout << elem << " ";}return 0;
}

1.4 std::forward_list(单向链表)

  • 特点:单向链表,节省内存,只支持前向遍历。
  • 优点:更少的内存开销,适用于只需要前向遍历的情况。
  • 缺点:不支持双向遍历。
  • 适用场景:当只需要前向遍历且希望节省内存时。
  • 示例代码:
#include <iostream>
#include <forward_list>int main() {std::forward_list<int> flst = {1, 2, 3};flst.push_front(0); // 在开头插入for (auto it = flst.begin(); it != flst.end(); ++it) {std::cout << *it << " ";}return 0;
}



2. 关联容器(Associative Containers)

        关联容器以键值对的形式存储数据,并根据键自动排序。主要的关联容器有 std::set、std::map、std::multiset 和 std::multimap。

2.1 std::set

  • 特点:键唯一,自动排序。
  • 优点:查找、插入和删除操作的时间复杂度为 O(log n)。
  • 适用场景:需要保证元素唯一性和有序性。
  • 示例代码:
#include <iostream>
#include <set>int main() {std::set<int> s = {5, 1, 3, 2, 4};for (const auto& elem : s) {std::cout << elem << " ";}return 0;
}


2.2 std::map

  • 特点:键值对,键唯一,自动排序。
  • 优点:快速查找、插入和删除操作。
  • 适用场景:需要键值映射关系,并且键必须唯一。
  • 示例代码:
#include <iostream>
#include <map>int main() {std::map<std::string, int> m = {{"apple", 1}, {"banana", 2}};m["orange"] = 3;for (const auto& [key, value] : m) {std::cout << key << ": " << value << "\n";}return 0;
}

2.3 std::multiset

  • 特点:允许重复键,自动排序。
  • 适用场景:允许相同元素存在,并保持有序性。
  • 示例代码: 
#include <iostream>
#include <set>int main() {std::multiset<int> ms = {1, 2, 2, 3};for (const auto& elem : ms) {std::cout << elem << " ";}return 0;
}

2.4 std::multimap

  • 特点:键值对,允许重复键,自动排序。
  • 适用场景:允许多个键映射到同一个值,并保持有序性。
  • 示例代码: 
#include <iostream>
#include <map>int main() {std::multimap<int, std::string> mm = {{1, "apple"}, {1, "orange"}, {2, "banana"}};for (const auto& [key, value] : mm) {std::cout << key << ": " << value << "\n";}return 0;
}


3. 无序关联容器(Unordered Associative Containers)

        无序关联容器也以键值对形式存储数据,但不保证任何特定顺序。主要的无序关联容器有 std::unordered_set、std::unordered_map、std::unordered_multiset 和 std::unordered_multimap。

3.1 std::unordered_set

  • 特点:键唯一,不保证顺序。
  • 优点:平均查找、插入和删除操作的时间复杂度为 O(1)。
  • 适用场景:需要快速查找、插入和删除操作,但不需要有序性。
  • 示例代码: 
#include <iostream>
#include <unordered_set>int main() {std::unordered_set<int> us = {1, 2, 3, 4, 5};for (const auto& elem : us) {std::cout << elem << " ";}return 0;
}

3.2 std::unordered_map

  • 特点:键值对,键唯一,不保证顺序。
  • 优点:平均查找、插入和删除操作的时间复杂度为 O(1)。
  • 适用场景:需要快速查找、插入和删除操作,但不需要有序性。
  • 示例代码:
#include <iostream>
#include <unordered_map>int main() {std::unordered_map<std::string, int> um = {{"apple", 1}, {"banana", 2}};um["orange"] = 3;for (const auto& [key, value] : um) {std::cout << key << ": " << value << "\n";}return 0;
}

3.3 std::unordered_multiset

  • 特点:允许重复键,不保证顺序。
  • 适用场景:允许相同元素存在,但不需要有序性。
  • 示例代码: 
#include <iostream>
#include <unordered_set>int main() {std::unordered_multiset<int> ums = {1, 2, 2, 3};for (const auto& elem : ums) {std::cout << elem << " ";}return 0;
}

3.4 std::unordered_multimap

  • 特点:键值对,允许重复键,不保证顺序。
  • 适用场景:允许多个键映射到同一个值,但不需要有序性。
  • 示例代码: 
#include <iostream>
#include <unordered_map>int main() {std::unordered_multimap<int, std::string> umm = {{1, "apple"}, {1, "orange"}, {2, "banana"}};for (const auto& [key, value] : umm) {std::cout << key << ": " << value << "\n";}return 0;
}


总结

        C++ 标准库中的容器类为开发者提供了强大的工具来管理数据。选择合适的容器类型取决于具体的应用需求,例如是否需要有序性、是否允许重复元素、是否需要快速的查找和插入等。通过合理选择和使用这些容器,可以编写出更高效、更易维护的代码。

http://www.lryc.cn/news/509552.html

相关文章:

  • 优化 invite_codes 表的 SQL 创建语句
  • springboot容器无法获取@Autowired对象,报null对象空指针问题的解决方式
  • 服务器数据恢复—Lustre分布式文件系统下服务器节点进水的数据恢复案例
  • 由于这些关键原因,我总是手边有一台虚拟机
  • word无法创建工作文件,检查临时环境变量。
  • 照亮技术传播之路:构建卓越的技术文档
  • 20241225在ubuntu20.04.5下监控SSD
  • Flink定时器
  • 《算力互联互通标准体系1.0》发布,为算力互联成网发展提供指导框架
  • 视频监控平台:Liveweb视频汇聚融合平台智慧安防视频监控应用方案
  • STM32串口第一次接收数据时第一个字节丢失的问题
  • Zookeeper基本命令解析
  • RustDesk远程及自建服务器搭建教程
  • 广州大彩串口屏安卓/linux触摸屏四路CVBS输入实现同时显示!
  • Python:模拟(包含例题)
  • Python OCR 文字识别
  • 阿里巴巴2017实习生笔试题(二)
  • Docker安装与使用
  • 通过nginx设置一个图片服务器,并使用 Nginx 作为反向代理
  • MacOS M3源代码编译Qt6.8.1
  • 【Pytorch实用教程】PyTorch 自带的数据集全面解读
  • Flask使用的正例和反例
  • 2024年河北省职业院校技能大赛云计算应用赛项赛题第2套(私有云)
  • 我的软件架构师——Java 职位面试经历。
  • npm error code ETIMEDOUT
  • (11)(3.2) ESC信号问题
  • Postman最新接口自动化持续集成
  • windows nacos安装配置
  • 重温设计模式-外观模式和适配器模式的异同
  • 数据中台从centos升级为国产操作系统后,资源增加字段时,提交报500错误