C++中,vector、deque、list、set、multiset、unordered_set和unordered_multiset容器类的总结

最近用set比较多,复习一下基础。

在C++中,vector、deque、list、set、multiset、unordered_set和unordered_multiset都是容器类,但它们有不同的特点和用途。下面是对它们的区别和示例说明:

1. vector

  • 特点: 动态数组,支持快速随机访问(通过索引)。
  • 时间复杂度: 插入和删除操作在末尾是常数时间复杂度,在中间和开头是线性时间复杂度。访问元素是常数时间复杂度。
  • 用途: 适用于需要频繁随机访问和在末尾进行插入和删除的情况。
cpp 复制代码
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3};
    vec.push_back(4); // 在末尾插入
    vec[1] = 10; // 通过索引访问和修改

    for (int n : vec) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

2. deque

  • 特点: 双端队列,支持快速在两端进行插入和删除。
  • 时间复杂度: 两端插入和删除是常数时间复杂度,随机访问是常数时间复杂度。
  • 用途: 适用于需要在两端进行插入和删除操作的情况。
cpp 复制代码
#include <deque>
#include <iostream>

int main() {
    std::deque<int> deq = {1, 2, 3};
    deq.push_front(0); // 在前端插入
    deq.push_back(4); // 在末尾插入

    for (int n : deq) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

3. list

  • 特点: 双向链表,支持快速在任意位置进行插入和删除,但不支持随机访问。
  • 时间复杂度: 插入和删除是常数时间复杂度,访问元素是线性时间复杂度。
  • 用途: 适用于需要频繁插入和删除元素而不需要随机访问的情况。
cpp 复制代码
#include <list>
#include <iostream>

int main() {
    std::list<int> lst = {1, 2, 3};
    lst.push_front(0); // 在前端插入
    lst.push_back(4); // 在末尾插入
    auto it = lst.begin();
    std::advance(it, 2);
    lst.insert(it, 10); // 在中间插入

    for (int n : lst) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

4. set

  • 特点: 有序集合,元素不重复,自动排序。
  • 时间复杂度: 插入、删除、查找操作是对数时间复杂度。
  • 用途: 适用于需要有序集合且元素唯一的情况。
cpp 复制代码
#include <set>
#include <iostream>

int main() {
    std::set<int> s = {3, 1, 2};
    s.insert(4); // 插入元素

    for (int n : s) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

5. multiset

  • 特点: 有序集合,允许重复元素,自动排序。
  • 时间复杂度: 插入、删除、查找操作是对数时间复杂度。
  • 用途: 适用于需要有序集合且允许重复元素的情况。
cpp 复制代码
#include <set>
#include <iostream>

int main() {
    std::multiset<int> ms = {3, 1, 2, 2};
    ms.insert(4); // 插入元素

    for (int n : ms) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

6. unordered_set

  • 特点: 无序集合,元素不重复,使用哈希表实现。
  • 时间复杂度: 插入、删除、查找操作是平均常数时间复杂度。
  • 用途: 适用于需要快速查找且不关心顺序的情况。
cpp 复制代码
#include <unordered_set>
#include <iostream>

int main() {
    std::unordered_set<int> us = {3, 1, 2};
    us.insert(4); // 插入元素

    for (int n : us) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

7. unordered_multiset

  • 特点: 无序集合,允许重复元素,使用哈希表实现。
  • 时间复杂度: 插入、删除、查找操作是平均常数时间复杂度。
  • 用途: 适用于需要快速查找且允许重复元素的情况。
cpp 复制代码
#include <unordered_set>
#include <iostream>

int main() {
    std::unordered_multiset<int> ums = {3, 1, 2, 2};
    ums.insert(4); // 插入元素

    for (int n : ums) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}
相关推荐
Dovis(誓平步青云)6 分钟前
拖动关键帧角色就抽动,动画编辑器怎样补齐中间状态
开发语言·前端·javascript·机器学习·编辑器
行走的陀螺仪9 分钟前
Claude Code 从入门到实战(二):Bash工具、Plan模式与后台任务
开发语言·bash
東隅已逝,桑榆非晚13 分钟前
红黑树:从概念到实现
数据结构·c++·笔记·学习
努力努力再努力wz15 分钟前
【Lua 入门系列】从执行模型到事件驱动:一文理解 Lua 有栈协程、挂起恢复与协作式调度
开发语言·lua
椒颜皮皮虾྅32 分钟前
一套 C# 接口,解锁四类视觉任务:DeploySharp 分类、分割、关键点与旋转框实战
开发语言·分类·c#
2603_965896621 小时前
JavaScript 原型与原型链
开发语言·前端·javascript
艾莉丝努力练剑1 小时前
【AI大模型接入SDK】ChatServer接口测试
网络·c++·人工智能·学习·ai·大模型·sdk
朋友圈自动点赞工具1 小时前
Ruby方法查找:对象不存方法
开发语言·前端·ruby·科技资讯
D e re k ZH1 小时前
C++ 模板与泛型编程进阶(No 2)
开发语言·c++
一级新生1 小时前
LLM _ Agent _ Skill _ 专家 的关系与选型笔记
java·开发语言·人工智能·笔记·大模型·智能体·skill