C++中的STL容器

news2024/11/24 20:56:37

文章目录

  • 一、序列式容器
    • 1.vector
    • 2.array
    • 3.deque
    • 4.list
    • 5.forward_list
  • 二、关联式容器
    • 1.set、multiset、unordered_set和unordered_multiset
    • 2.map、multimap、unordered_map和unordered_multimap

在这里插入图片描述

STL中的容器将一些应用最为广泛的数据结构实现了出来,它主要分为序列式容器关联式容器两类。

一、序列式容器

1.vector

https://zh.cppreference.com/w/cpp/container/vector

vector是应用最为广泛的顺序容器,可以简单地将它看作是一个能够存放任意类型元素的动态数组,是使用new创建动态数组的替代品。实际上,vector类确实使用new和delete来管理内存,只不过这种工作是自动完成的。vector在尾部添加或移除元素非常快速,但是在中间及起始位置插入元素时可能会导致很多后续元素的重新构造,效率比较低

向vector中插入元素时,如果已分配的空间不足,不会在后面直接追加分配,而是重新分配所有的空间(默认分配二倍大小的空间),然后依次拷贝原vector中的数据,因此可以通过reserve()为vector提前预留空间以减少拷贝次数。

此外,也可以通过emplace_back()原地构造,以避免每次插入时创建临时对象。

#include <iostream>
#include <vector>

using namespace std;

class Car {
private:
    int m_id;

public:
    explicit Car(int id) : m_id(id) {
        cout << "Car(" << id << ")" << endl;
    }

    Car(const Car &other) {
        cout << "copy Car(" << other.m_id << ")" << endl;
        this->m_id = other.m_id;
    }

    ~Car() {
        cout << "~Car(" << m_id << ")" << endl;
    }
};

int main(int argc, char *argv[]) {
    vector<Car> v;

    // cout << v.capacity() << endl;
    // v.reserve(10);
    // cout << v.capacity() << endl;

    // v.emplace_back(1);
    v.push_back(Car(1));

    cout << "---" << endl;

    // v.emplace_back(2);
    v.push_back(Car(2));

    cout << "---" << endl;

    return 0;
}
atreus@MacBook-Pro % clang++ main.cpp -o main -std=c++11
atreus@MacBook-Pro % ./main                             
Car(1) // 构造临时对象
copy Car(1) // 从临时对象向vector中拷贝(使用emplace_back时不会有此过程)
~Car(1) // 析构临时对象(使用emplace_back时不会有此过程)
---
Car(2) // 构造临时对象
copy Car(2) // 从临时对象向vector中拷贝(使用emplace_back时不会有此过程)
copy Car(1) // 从原vector向新vector拷贝 (提前使用reserve时不会有此过程)
~Car(1) // 析构原vector中的对象 (提前使用reserve时不会有此过程)
~Car(2) // 析构临时对象(使用emplace_back时不会有此过程)
---
~Car(2) // 析构新vector中的对象
~Car(1) // 析构新vector中的对象
atreus@MacBook-Pro % 

2.array

https://zh.cppreference.com/w/cpp/container/array

vector类的功能比数组强大,但付出的代价是效率稍低。在需要长度固定的数组时,使用普通数组是更好的选择,但代价是不那么方便和安全。因此C++11新增了模板类array,它也位于名称空间std中。和普通数组一样,array对象的长度也是固定的,也使用栈(静态内存分配),而不是自由存储区,因此其效率与普通数组基本相同,但更方便,更安全。

3.deque

https://zh.cppreference.com/w/cpp/container/deque

deque模板类表示双端队列,其实现类似于vector容器,支持随机访问,区别在于从deque对象的起始位置进行插入和删除的时间是固定的,所以如果多数操作发生在序列的起始和结尾处,可以考虑deque。

4.list

https://zh.cppreference.com/w/cpp/container/list

list模板类表示双向链表,除了第一个和最后一个元素外,所有元素都与前后的元素相连接,这意味着可以双向遍历链表。list和vector的关键区别在于,list在链表中任一位置进行插入和删除的时间都是固定的,但很显然list不支持随机访问。

5.forward_list

https://zh.cppreference.com/w/cpp/container/forward_list

C++11新增了容器类forward_list,它实现了单链表,即每个节点都只链接到下一个节点,相比于list,forward_list更简单但功能更紧凑,但功能也更少。

二、关联式容器

1.set、multiset、unordered_set和unordered_multiset

https://zh.cppreference.com/w/cpp/container/set

set表示关联集合,可反转可排序,且键是唯一的,所以不能存储多个相同的值。

集合底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
std::set红黑树key有序key不可重复key不可修改 O ( log ⁡ n ) O(\log n) O(logn) O ( log ⁡ n ) O(\log n) O(logn)
std::multiset红黑树key有序key可重复key不可修改 O ( log ⁡ n ) O(\log n) O(logn) O ( log ⁡ n ) O(\log n) O(logn)
std::unordered_set哈希表key无序key不可重复key不可修改 O ( 1 ) O(1) O(1) O ( 1 ) O(1) O(1)
std::unordered_multiset哈希表key无序key可重复key不可修改 O ( 1 ) O(1) O(1) O ( 1 ) O(1) O(1)
#include <iostream>
#include <set>

using namespace std;

int main(int argc, char *argv[]) {
    set<int> A{1, 2, 3};
    set<int> B{2, 3, 4};
    set<int> C{5};
    set<int> D{1};

    set_union(A.begin(), A.end(), B.begin(), B.end(), insert_iterator<set<int>>(C, C.end()));
    set_intersection(A.begin(), A.end(), B.begin(), B.end(), insert_iterator<set<int>>(D, D.end()));

    for (auto i: C) { cout << i << " "; } // 1 2 3 4 5
    cout << "\n---\n";
    for (auto i: D) { cout << i << " "; } // 1 2 3

    return 0;
}

2.map、multimap、unordered_map和unordered_multimap

https://zh.cppreference.com/w/cpp/container/map

map是有序键值对容器,它里面的所有元素都是pair,同时拥有实值(value)和键值(key),且pair的第一元素被视为键值,第二元素被视为实值。map不允许两个元素拥有相同的键值,但multimap允许键值重复。

映射底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
std::map红黑树key有序key不可重复key不可修改 O ( log ⁡ n ) O(\log n) O(logn) O ( log ⁡ n ) O(\log n) O(logn)
std::multimap红黑树key有序key可重复key不可修改 O ( log ⁡ n ) O(\log n) O(logn) O ( log ⁡ n ) O(\log n) O(logn)
std::unordered_map哈希表key无序key不可重复key不可修改 O ( 1 ) O(1) O(1) O ( 1 ) O(1) O(1)
std::unordered_multimap哈希表key无序key可重复key不可修改 O ( 1 ) O(1) O(1) O ( 1 ) O(1) O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/448768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用python下载wallpaper Engine订阅的壁纸/视频

一、为什么想下载wallpaper Engine的壁纸 在游戏平台steam上&#xff0c;有一个壁纸软件wallpaper Engine&#xff0c;人称小红车&#xff0c;里面有各种好看的动态壁纸和视频&#xff0c;可以给我们的电脑设置动态桌面&#xff0c;非常好用。   用过几次后&#xff0c;我有了…

Doris(14):索引

1 概念 索引用于帮助快速过滤或查找数据。 目前 Doris 主要支持两类索引&#xff1a; 内建的智能索引&#xff0c;包括前缀索引和ZoneMap索引用户创建的二级索引&#xff0c;包括Bloom Filter索引和Bitmap倒排索引。 前缀索引&#xff1a;即在排序的基础上&#xff0c;实现的…

kv server(配置以及性能测试)

首先在 Cargo.toml 里添加 serde 和 toml。我们计划使用 toml 做配置文件&#xff0c;serde 用来处理配置的序列化和反序列化&#xff1a; [dependencies] ... serde { version "1", features ["derive"] } # 序列化/反序列化 ... toml "0.5"…

antd表格a-table滚动失效。x轴滚动失效

目录 antd表格a-table滚动失效。x轴滚动失效 页面html代码如下。实现左右布局&#xff0c;左边侧边栏固定宽度&#xff0c;右边沾满剩余宽度 解决方案&#xff1a;在计算右侧宽度时&#xff0c;左边侧边栏固定宽度&#xff0c;右边沾满剩余宽度 情况1&#xff1a;左侧侧边栏…

第八章 查询和检索:Query DSL

版权声明 本文为Elastic开源社区版权所有,保证独立性和原创性,未获得授权和允许,任何组织和个人不得以任何方式传播或复制或分享。否则必将追究法律责任。 知识内容输出不易,请尊重他人劳动成果。严禁随意传播、复制和盗用他人成果或文章内容用以商业或盈利目的! 1、查询…

5.4 龙贝格算法

为什么有龙贝格算法&#xff1a; 龙贝格算法是一种数值积分方法&#xff0c;用于计算定积分的数值近似值。它是基于复合梯形法和复合辛普森法的推广和拓展&#xff0c;可以达到更高的精度。相较于复合梯形法和复合辛普森法&#xff0c;龙贝格算法的收敛速度更快&#xff0c;且…

nerfstudio介绍及在windows上的配置、使用

nerfstudio提供了一个简单的API&#xff0c;可以简化创建、训练和可视化NeRF的端到端过程。该库通过模块化每个组件来支持可解释的NeRF实现。nerfstudio源码地址: https://github.com/nerfstudio-project/nerfstudio , 通过模块化集成了多个NeRF扩展的实现&#xff0c;持续更新…

JUC-多线程(12. AQS)学习笔记

文章目录 1. 可重入锁1.1. 概述1.2. 可重入锁类型1.3. Synchronized 可重入实现机理 2. LockSupport2.1. LockSupport 是什么2.2. 3种线程等待唤醒的方法2.2.1 Object 的等待与唤醒2.2.2. Condition接口中的等待与唤醒2.2.3. 传统的 synchronized 和 Lock 实现等待唤醒通知的约…

C/C++开发,opencv读写图像与视频

目录 一、opencv的图像缓存表达&#xff08;cv::mat&#xff09; 二、图片读写 2.1 图片读写API 2.2 图片读写案例 2.3 案例编译与测试 三、opencv的视频读写&#xff1a; 3.1 视频读写接口 3.2 视频读写案例 3.3 编译与测试 一、opencv的图像缓存表达&#xff08;cv::mat&am…

2023网络搭建项目改革

好久没更新了&#xff0c;哈哈哈&#xff0c;也废话不多说&#xff0c;直接进入正题。 3月的时候就有人吓我说什么网搭取消了&#xff0c;当时我还觉得高兴&#xff0c;主要是不喜欢这个行业&#xff0c;要是没了我就可以跑路了&#xff0c;哈哈&#xff0c;然后我就觉得很奇怪…

【嵌入式系统与入门】Day02 Arduino 按键、蜂鸣器与湿温度传感器

文章目录 1. 按键控制1.1 认识按键1.2 工作原理1.3 Arduino代码展示1.4 原理图1.5 实现去抖【消抖动延时】 2. 蜂鸣器控制2.1 认识蜂鸣器2.2 分类2.3 工作原理2.4 连线2.5 Arduino代码展示 3. PWM模拟量输出3.2 Arduino代码展示 4. 湿温度测量4.1 认识器件4.2 传感器接口4.3 Ar…

CMU-自主探索导航系统(TARE FAR Planner)学习-All in one

参考引用 Autonomous Exploration Development EnvironmentTARE机器人自主导航系统社区-CSDN社区云TARE机器人自主导航系统公开课1TARE机器人自主导航系统公开课2CMU团队开发的全套开源自主导航算法FAR Planner —— IROS2022 最佳学生论文&#xff1c;论文阅读&#xff1e;TAR…

【源码分析】XXL-JOB的执行器的注册流程

目的&#xff1a;分析xxl-job执行器的注册过程 流程&#xff1a; 获取执行器中所有被注解(xxlJjob)修饰的handler执行器注册过程执行器中任务执行过程 版本&#xff1a;xxl-job 2.3.1 建议&#xff1a;下载xxl-job源码&#xff0c;按流程图debug调试&#xff0c;看堆栈信息…

【ONE·C++ || stack queue (一)】

总言 主要介绍栈和队列的基本函数使用&#xff1a;栈和队列、优先级队列、适配器、反向迭代器。 文章目录 总言1、栈和队列接口基本介绍1.1、基本介绍1.2、相关例题1.2.1、最小栈1.2.2、栈的压入、弹出序列1.2.3、逆波兰表达式求值 2、适配器介绍2.1、引入&#xff1a;如何实现…

儿童用灯哪个品牌好?分享五款儿童护眼台灯品牌

家中有小朋友上了幼儿园就已经戴上了眼镜&#xff0c;太让人心疼了 近视已经成为世界难题&#xff0c;而我国儿童近视形式尤为严峻 据官方数据显示&#xff0c;我国儿童青少年总体近视率竟高达52.7% 如何保护孩子眼睛&#xff0c;儿童用灯哪个品牌好&#xff1f; 那今天&am…

Open vSwitch 入门实践(8) VXLAN实验

目录 什么是VXLAN&#xff1f; VXLAN解决了什么问题&#xff1f; VXLAN网络如何工作&#xff1f; 简单VXLAN实验 主机A 主机B 测试 什么是VXLAN&#xff1f; VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟扩展局域网&#xff09;&#xff0…

Spring依赖注入 - Resource注解详解及与Autowired注解区别

上篇博客我们讲了Spring中的自动注入(byName,byType)和Autowired注解的工作原理以及源码分析&#xff0c;那么这次&#xff0c;我们来分析还没讲完的&#xff0c;剩下的核心的方法&#xff1a; Nullable Object resolveDependency(DependencyDescriptor descriptor, Nullable …

0.96寸OLED液晶显示器

在日常的小项目制作中我们经常会接触到OLED液晶显示器&#xff0c;本文介绍0.96寸液晶显示器的基本原理&#xff0c;辅助我们后续的小项目开发 OLED被称为有机激光二极管&#xff0c;也被称为有机激光显示&#xff0c;OLED采用有机材料涂层和玻璃基板&#xff0c;当有电流通过…

#Chrome扩展程序开发教程--02:Hello Extensions

#Chrome扩展程序开发教程--02&#xff1a;Hello Extensions 引言1、Hello Extensions2、固定扩展程序3、重新加载扩展程序4、查看扩展程序的输出 引言 本系列博客旨在带来最新的Chrome扩展程序开发入门教程。 1、Hello Extensions 本节博客中&#xff0c;笔者将带领读者创建一个…

C++附加篇: 空间适配器

"我有时难过&#xff0c;却还有些抚慰和感动。" 一、我们来谈谈空间适配器 (1) 什么是空间配置器? STL的六大组件&#xff0c;容器、算法、迭代器、适配器、仿函数&#xff0c;最后一个也就是"空间适配器"。 所谓"空间适配器"&#x…