C++ 容器使用指南

C++ 容器使用指南

一.迭代器

当使用 C++ 中的容器(如 std::vectorstd::liststd::map 等)时,迭代器是一种非常重要的工具

它们提供了一种通用的方式来访问容器中的元素,允许我们对容器进行遍历、访问、修改和删除操作

1.开始和结束迭代器

  • begin():返回指向容器第一个元素的迭代器
  • end():返回指向容器尾部(最后一个元素的下一个位置)的迭代器
#include <iostream>
#include <vector>
int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用迭代器遍历容器for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

2.解引用迭代器

  • *it:解引用迭代器,获取迭代器指向的元素的值
std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = vec.begin();
std::cout << *it << std::endl;  // 输出第一个元素的值

3.向容器中插入和删除元素

  • insert(it, value):在迭代器位置插入元素
  • erase(it):删除迭代器指向的元素
std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = vec.begin() + 2;  // 迭代器指向第三个元素
// 在迭代器位置插入元素
vec.insert(it, 10);
// 删除迭代器指向的元素
vec.erase(it);

4. 自增和自减操作

  • ++it:迭代器自增,指向下一个元素
  • --it:迭代器自减,指向前一个元素

5. 检查迭代器是否有效

  • it != container.end():迭代器不等于容器的结束迭代器,表示迭代器有效
  • it == container.end():迭代器等于容器的结束迭代器,表示迭代器无效(已经遍历到容器末尾)

三.动态数组(Vector)(向量)

  • 特点
    • 动态数组,支持随机访问
    • 连续内存存储,支持快速的随机访问和插入删除末尾元素
    • 自动扩展容量,但当容量不够时需要重新分配内存,可能导致性能开销。
  • 注意事项
    • 插入和删除操作在末尾较高效,在中间或头部可能效率较低
    • 当需要频繁在中间位置插入或删除元素时,考虑使用其他容器,如双向链表

1.头文件:

#include <vector>

2.创建和初始化向量

使用 std::vector 来定义一个向量,可以指定元素类型,也可以不指定类型,默认构造一个空向量

vector<int> myVector;  // 定义一个整数类型的向量,默认为空
vector<int> myVector2(5);  // 定义一个包含5个元素的整数向量,初始值为0
vector<int> myVector3 = {1, 2, 3, 4, 5};  // 初始化一个包含元素的向量

3.添加元素到向量末尾

使用 push_back 函数将元素添加到向量的末尾

myVector.push_back(10);
myVector.push_back(20);
myVector.push_back(30);
// myVector: [10, 20, 30]

4.访问和修改元素

可以使用下标操作符 [] 来访问向量中的元素,也可以使用 at() 函数来访问指定位置的元素。使用这些方式也可以修改元素的值

int firstElement = myVector[0];  // 访问第一个元素
int secondElement = myVector.at(1);  // 访问第二个元素
myVector[2] = 35;  // 修改第三个元素的值为 35

5.获取向量大小

使用 size() 函数来获取向量中元素的数量

cout << "Size of myVector: " << myVector.size() << endl;  // 输出 3

6.迭代访问

可以使用迭代器来遍历向量中的元素

for (auto it = myVector.begin(); it != myVector.end(); ++it) {cout << *it << " ";
}
cout << endl;

也可以使用范围-based for 循环来遍历

for (int num : myVector) {cout << num << " ";
}
cout << endl;

7.删除元素

  • 使用 pop_back() 函数删除向量末尾的元素
myVector.pop_back();  // 删除末尾的元素
// myVector: [10, 20]
  • 使用 erase() 函数删除指定位置的元素
myVector.erase(myVector.begin() + 1);  // 删除第二个元素
// myVector: [10]

8.清空向量

使用 clear() 函数清空向量中的所有元素

Vector.clear();  // 清空向量
// myVector: []

三.哈希表(映射)(Map)

  • 特点
    • 存储键值对的容器
    • 键是唯一的,值可以重复。
    • 通过键快速查找对应的值
  • 注意事项
    • 插入相同键的元素会覆盖原来的值
    • 查找元素的时间复杂度为 O(log n),插入和删除操作的时间复杂度也为 O(log n)

1.包文件

#include <unordered_map>

1.创建和初始化

#include <iostream>
unordered_map<std::string, int> myMap = {{"apple", 5},{"banana", 3},{"cherry", 7}
};

2.插入和访问元素

  • insert({key, value}):插入键值对
  • operator[]:访问或设置元素值
myMap.insert({"date", 10});  // 插入键值对
myMap["grape"] = 4;          // 设置元素值// 访问元素
cout << "键值: " << myMap["cherry"] << endl;

3.删除元素

  • erase(key):删除指定键对应的元素
myMap.erase("banana");  // 删除元素

4.检查键是否存在

  • count(key):检查指定键是否存在,返回 1 表示存在,0 表示不存在
if (myMap.count("banana")) {cout << "myMap有Banana" << endl;
} else {cout << "myMap没有Banana" << endl;
}

5.遍历

可以使用迭代器遍历哈希表中的键值对

for (const auto& pair : myMap) {cout << pair.first << " : " << pair.second << endl;
}

6.获取哈希表大小

  • size():返回哈希表中键值对的数量
cout << "Size of myMap: " << myMap.size() << endl;

7.清空哈希表

  • clear():清空哈希表中的所有元素
myMap.clear();  // 清空哈希表

四.双向链表(List)

  • 特点
    • 每个节点有指向前一个和后一个节点的指针
    • 适合频繁在中间位置插入或删除元素
    • 不支持随机访问,需要通过迭代器遍历
  • 注意事项
    • 插入和删除操作效率高,时间复杂度为 O(1)
    • 如果需要随机访问元素,考虑使用其他容器,如向量或集合

1.包文件

#include <list>

2.创建和初始化

// 创建一个整型列表
list<int> myList = {1, 2, 3, 4, 5};

3.插入元素

  • push_back(value):在列表末尾插入元素
  • push_front(value):在列表头部插入元素
  • insert(iterator, value):在指定位置插入元素
myList.push_back(6);          // {1, 2, 3, 4, 5, 6}
myList.push_front(0);         // {0, 1, 2, 3, 4, 5, 6}
auto it = myList.begin();     // 获取迭代器指向头部
myList.insert(++it, 10);      // {0, 10, 1, 2, 3, 4, 5, 6}

4.删除元素

  • pop_back():删除列表末尾元素
  • pop_front():删除列表头部元素
  • erase(iterator):删除指定位置的元素
  • remove(value):删除所有等于指定值的元素
codemyList.pop_back();            // {0, 10, 1, 2, 3, 4, 5}
myList.pop_front();               // {10, 1, 2, 3, 4, 5}
auto it2 = myList.begin();
myList.erase(++it2);              // {10, 2, 3, 4, 5}
myList.remove(3);                 // {10, 2, 4, 5}

5.访问元素

  • 使用迭代器遍历列表元素
  • begin() 返回指向列表第一个元素的迭代器
  • end() 返回指向列表末尾(最后一个元素的下一个位置)的迭代器
// 遍历列表
for (auto it = myList.begin(); it != myList.end(); ++it) {cout << *it << " ";
}
cout << endl;// 反向遍历列表
for (auto rit = myList.rbegin(); rit != myList.rend(); ++rit) {std::cout << *rit << " ";
}
cout << endl;

6.获取列表大小

cout << "列表的大小: " << myList.size() << endl;
  • size():返回列表中元素的数量

7.清空列表

myList.clear();                // {}
  • clear():清空列表中所有元素

五.集合 (Set)

  • 特点
    • 存储一组不重复元素的容器
    • 自动排序(有序集合)或无序(无序集合)
    • 支持快速查找、插入和删除操作
  • 注意事项
    • 插入相同键的元素会覆盖原来的值
    • 查找元素的时间复杂度为 O(log n),插入和删除操作的时间复杂度也为 O(log n)

1.包文件

#include <set>

2.创建和初始化

// 创建一个整型集合
set<int> mySet = {4, 2, 1, 3, 5};

3.插入元素

  • insert(value):插入一个元素到集合中。
mySet.insert(6); // {1, 2, 3, 4, 5, 6}

4.删除元素

  • erase(value):删除指定值的元素。
  • erase(iterator):通过迭代器删除元素。
mySet.erase(3);  // {1, 2, 4, 5, 6}

5.查找元素

  • find(value):查找指定值的元素,返回指向该元素的迭代器。如果不存在,返回 end()
auto it = mySet.find(4);
if (it != mySet.end()) {cout << "查询:" << *it << endl;
} else {cout << "未查询到" << endl;
}

6.遍历集合

for (auto it = mySet.begin(); it != mySet.end(); ++it) {std::cout << *it << " ";
}
cout << endl;

7.获取集合大小

  • size():返回集合中元素的数量。
cout << "集合的大小: " << mySet.size() <<endl;

8.清空集合

  • clear():清空集合中所有元素。
mySet.clear();

六.堆栈 (Stack)

  • 特点
    • 后进先出(LIFO)的数据结构。
    • 只能在顶部添加和删除元素。
    • 用于函数调用、表达式求值等场景。
  • 注意事项
    • 使用 top() 前需确保堆栈非空,否则可能会导致未定义行为。
    • 操作堆栈的时间复杂度为 O(1)。

1.包文件

#include <stack>

2.创建和初始化

stack<int> myStack;

3.基本操作

  • push(value):将元素压入堆栈的顶部
  • pop():从堆栈顶部移除元素
  • top():获取堆栈顶部的元素
myStack.push(1);
myStack.push(2);
myStack.push(3);// myStack: [1, 2, 3]int topElement = myStack.top();  // 获取顶部元素,topElement = 3myStack.pop();  // 移除顶部元素// myStack: [1, 2]

4.检查堆栈是否为空

  • empty():如果堆栈为空,返回 true,否则返回 false
if (myStack.empty()) {cout << "堆栈为空." << endl;
} else {cout << "堆栈不为空" << endl;
}

5.获取堆栈大小

  • size():返回堆栈中元素的数量。
cout << "堆栈的大小: " << myStack.size() << endl;

七. 队列 (Queue)

  • 特点
    • 先进先出(FIFO)的数据结构
    • 只能在队尾添加元素,在队首移除元素
    • 用于任务调度、广度优先搜索等场景
  • 注意事项
    • 当队列为空时,尝试访问头部元素或移除元素会导致未定义行为
    • 操作队列的时间复杂度为 O(1)

1.包文件

#include <queue>

2.创建和初始化

queue<int> myQueue;

3.基本操作

  • push(value):将元素压入队列的末尾
  • pop():从队列的头部移除元素
  • front():获取队列头部的元素值
  • back():获取队列末尾的元素值
myQueue.push(1);
myQueue.push(2);
myQueue.push(3);// myQueue: [1, 2, 3]int frontElement = myQueue.front();  // 获取头部元素,frontElement = 1
int backElement = myQueue.back();    // 获取末尾元素,backElement = 3myQueue.pop();  // 移除头部元素// myQueue: [2, 3]

4.检查队列是否为空

  • empty():如果队列为空,返回 true,否则返回 false
if (myQueue.empty()) {cout << "队列为空" << endl;
} else {cout << "队列不为空" << endl;
}

5.获取队列大小

  • size():返回队列中元素的数量。
cout << "队列大小:" << myQueue.size() << endl;

后记

感谢读者阅读并关注博客文章,并对文章中提到的观点、建议或批评表示感谢✨✨✨

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

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

相关文章

给手机换电池、贴膜:VIVO服务还是非常好的

1月的时候去过一次售后&#xff0c;想了解一下手机电池情况&#xff0c;结果说这个型号无法检查。手机已经两年半了&#xff0c;电池容量估计不到80%了。这个手机很满意&#xff08;轻&#xff09;&#xff0c;新出的手机也没有明显优势&#xff0c;于是决心换个电池。一看售后…

每日学习笔记:C++ STL算法分类

非更易型 更易型 移除型 变序型 排序型 已排序区间算法 数值型算法

C++实现函数柯里化

1. 代码 需要c17特性。 #include <tuple>template <typename Function, typename... CapturedArgs> class curried { private:using CapturedArgsTuple std::tuple<std::decay_t<CapturedArgs>...>;template <typename... Args>static auto c…

【滑动窗口】Leetcode 将 x 减到 0 的最小操作数

题目解析 1658. 将 x 减到 0 的最小操作数 算法讲解 这道题按照题目要求的话会变得很难&#xff0c;因为不仅需要考虑数字减到0&#xff0c;还需要考虑最小的操作数。正难则反&#xff0c;按照这个思路&#xff0c;我们来解析题目 这道题本质上无非就是在左边寻找一段区间&a…

HCIP第三次作业(综合)

一、实验要求 二、实验步骤 1、配置IP地址部分 PC1&#xff1a; PC2&#xff1a; PC3&#xff1a; PC4&#xff1a; R1&#xff1a; R2&#xff1a; R3&#xff1a; R4&#xff1a; R5&#xff1a; 环回&#xff1a; 2.通过配置缺省路由让公网互通 [R1]ip route-static 0.0.…

Lambda 表达式

Lambda 表达式详细文档 简介 Lambda 表达式是一种匿名函数&#xff0c;允许您在不定义函数的情况下将代码块传递给其他函数或方法。Lambda 表达式通常用于简化代码&#xff0c;并使代码更具可读性。 语法 Lambda 表达式的语法如下&#xff1a; [capture-list] (parameter-…

代码随想录第27天| 39. 组合总和

39. 组合总和 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 带你学透回溯算法-组合总和&#xff08;对应「leetcode」力扣题目&#xff1a;39.组合总和&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 给你一个 无重复元…

思考:开启MMU瞬间可能出现的多种问题以及多种解决方案

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; (说明本文的介绍都是基于armv8-aarch64或armv9硬件架构) 在mmu未开启阶段&#xff0c;PC操作的都是物理地址执行程序&#xff0c;这样看起来一切正常&#xff0c;没啥问题。 例如…

Windows Server 2022 使用ApacheDS用户远程桌面登录服务器

Windows Server 2022 使用ApacheDS用户远程桌面登录服务器 1、接上篇 Windows Server 2022 使用ApacheDS用户认证 使用Administrator用户远程登录192.168.1.100windows server&#xff0c;打开pGina软件 2、输入刚刚在ApacheDS中的新添加的用户测试一下&#xff0c;会自动添加…

嵌入式Linux:fcntl()和ioctl()函数

目录 1、fcntl()函数 2、ioctl()函数 fcntl()和ioctl()是用于对文件描述符进行控制的两个系统调用&#xff0c;它们在不同的情况下有不同的用途和功能。 1、fcntl()函数 fcntl()函数提供了对已打开文件描述符执行各种控制操作的功能&#xff0c;例如复制文件描述符&#xf…

汽车电子行业知识:什么是车联网V2X技术

文章目录 一、V2X是什么?二、V2X功能有哪些?三、V2X的发展现状四、V2X包含哪些技术?五、V2X与哪些领域相关?六、V2X的未来趋势七、有哪些研发V2X技术的公司八、V2X技术应用的困境九、V2X技术应用的需求 自动驾驶、汽车互联等新一代信息技术和汽车产业融合发展已经成为…

如何在极狐GitLab 配置 邮件功能

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户…

【带你了解下前端开发语言有那些】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

爱上数据结构:二叉树的基本概念

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;数据结构 ​ 一、树的基本概念 1.概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起…

计算机网络数据链路层知识总结

物理层知识总结传送门 计算机网络物理层知识点总结-CSDN博客 功能 功能概述 一些基本概念 结点:主机、路由器链路﹔网络中两个结点之间的物理通道&#xff0c;链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路。数据链路︰网络中两个结点之间的逻辑通道&a…

Prometheus+grafana环境搭建rabbitmq(docker+二进制两种方式安装)(二)

搭建完Prometheusgrafana基础环境后参见&#xff1a;Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客&#xff0c;对我本地的一些常用法人服务进行一个监控。基本都可以根据官方文档完成搭建&#xff0c;因为docker和二进制方式安装各有优缺点。 d…

隐私计算实训营学习七:隐语SCQL的架构详细拆解

文章目录 一、SCQL Overview1.1 SCQL背景1.2 SCQL Overview 二、SCQL CCL三、SCQL架构 一、SCQL Overview 1.1 SCQL背景 SCQL&#xff1a;属于隐私计算BI范畴&#xff0c;允许多个互不信任参与方在不泄露各自隐私数据的条件下进行联合数据分析。 如下数据在不同机构&#xf…

Unity 学习日记 12.小球撞击冰块游戏

目录 1.准备场景 2.让小球动起来 3.用鼠标把小球甩出去 4.加入鼠标点击小球的判断 5.小球与冰块的碰撞测试 6.撞击后销毁冰块 ​编辑 7.显示游戏计时 8.显示扔球次数 9.显示剩余冰块个数 10.游戏结束 11.完整代码 下载源码 UnityPackage 最终效果&#xff1a; 1.准…

基于springboot+vue实现的房源出租信息系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

ElementUI响应式Layout布局xs,sm,md,lg,xl

响应式布局 参照了 Bootstrap 的 响应式设计&#xff0c;预设了五个响应尺寸&#xff1a;xs、sm、md、lg 和 xl。 <el-row :gutter"10"><el-col :xs"8" :sm"6" :md"4" :lg"3" :xl"1"><div class…