STL基本容器使用

IEEE S&P 2026 大模型安全论文整理 本文梳理了 IEEE S&P 2026(第47届 IEEE 安全与隐私研讨会)中与 LLM Safety 相关的论文,涵盖大模型越狱攻击、防御与对齐、隐私保护、RAG 安全、多模态大模型安全、智能体安全、图-LLM 安全、工具链安全及生成式 AI 安全与隐私等方向。 阅读详情

1:关联容器和顺序容器

  c++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector、list、deque等。其中vector表示一段连续的内存地址,基于数组的实现,list表示非连续的内存,基于链表实现。deque与vector类似,但是对于首元素提供删除和插入的双向支持。关联容器主要有map和set。map是key-value形式的,set是单值。map和set只能存放唯一的key值,multimap和multiset可以存放多个相同的key值。

容器类自动申请和释放内存,我们无需new和delete操作。

 

2:顺序容器的介绍

1):vector,需要包含头文件#include<vector>

主要的操作有

复制代码
 //1.定义和初始化
     vector<int> vec1;    //默认初始化,vec1为空
     vector<int> vec2(vec1);  //使用vec1初始化vec2
     vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2
     vector<int> vec4(10);    //10个值为0的元素
     vector<int> vec5(10,4);  //10个值为4的元素
  
     //2.常用操作方法
     vec1.push_back(100);            //尾部添加元素
     int size = vec1.size();         //元素个数
     bool isEmpty = vec1.empty();    //判断是否为空
     cout<<vec1[0]<<endl;        //取得第一个元素
     vec1.insert(vec1.end(),5,3);    //从vec1.back位置插入5个值为3的元素
     vec1.pop_back();              //删除末尾元素
     vec1.erase(vec1.begin(),vec1.begin()+2);//删除vec1[0]-vec1[2]之间的元素,不包括vec1[2]其他元素前移
    cout<<(vec1==vec2)?true:false;  //判断是否相等==、!=、>=、<=...
     vector<int>::iterator iter = vec1.begin();    //获取迭代器首地址
    vector<int>::const_iterator c_iter = vec1.begin();   //获取const类型迭代器
    vec1.clear();                 //清空元素
  
     //3.遍历
     //下标法
    int length = vec1.size();
     for(int i=0;i<length;i++)
     {
        cout<<vec1[i];
     }
     cout<<endl<<endl;
     //迭代器法
    vector<int>::iterator iter = vec1.begin();
     for(;iter != vec1.end();iter++)
     {
        cout<<*iter;
     }
复制代码

2)list,list是stl实现的双向链表,与向量vector想比,它允许快速的插入和删除,但是随机访问却是比较慢,需要添加头文件#include<list>

主要的操作

复制代码
  //1.定义和初始化
    list<int> lst1;          //创建空list
    list<int> lst2(3);       //创建含有三个元素的list
    list<int> lst3(3,2); //创建含有三个元素为2的list
    list<int> lst4(lst2);    //使用lst2初始化lst4
    list<int> lst5(lst2.begin(),lst2.end());  //同lst4
 
    //2.常用操作方法
    lst1.assign(lst2.begin(),lst2.end());  //分配值,3个值为0的元素
    lst1.push_back(10);                    //末尾添加值
    lst1.pop_back();                   //删除末尾值
    lst1.begin();                      //返回首值的迭代器
    lst1.end();                            //返回尾值的迭代器
    lst1.clear();                      //清空值
    bool isEmpty1 = lst1.empty();          //判断为空
    lst1.erase(lst1.begin(),lst1.end());                        //删除元素
    lst1.front();                      //返回第一个元素的引用
    lst1.back();                       //返回最后一个元素的引用
    lst1.insert(lst1.begin(),3,2);         //从指定位置插入个3个值为2的元素
    lst1.rbegin();                         //返回第一个元素的前向指针
    lst1.remove(2);                        //相同的元素全部删除
    lst1.reverse();                        //反转
    lst1.size();                       //含有元素个数
    lst1.sort();                       //排序
    lst1.unique();                         //删除相邻重复元素
 
    //3.遍历
    //迭代器法
    for(list<int>::const_iterator iter = lst1.begin();iter != lst1.end();iter++)
    {
       cout<<*iter;
    }
复制代码

3):deque
  deque容器类与vector类似,支持随机访问和快速插入和删除,与vector不同,deque还支持从开始端插入数据:push_front。其余的类似vector操作方法的使用.

3:关联容器的介绍

1)map的介绍

  c++map容器提供一个键值对(key/value)容器,map与multimap差别仅仅在于multimap允许一个键对应多个值。需要包含头文件#include<map>。对于迭代器来说,可以修改实值,而不能修改key。map会根据key自动排序.

常用操作如下:

复制代码
  //1.定义和初始化
    map<int,string> map1;                  //空map
   
    //2.常用操作方法
    map1[3] = "Saniya";                    //添加元素
    map1.insert(map<int,string>::value_type(2,"Diyabi"));//插入元素
    //map1.insert(pair<int,string>(1,"Siqinsini"));
    map1.insert(make_pair<int,string>(4,"V5"));
    string str = map1[3];                  //根据key取得value,key不能修改
    map<int,string>::iterator iter_map = map1.begin();//取得迭代器首地址
    int key = iter_map->first;             //取得key
    string value = iter_map->second;       //取得value
    map1.erase(iter_map);                  //删除迭代器数据
    map1.erase(3);                         //根据key删除value
    map1.size();                       //元素个数
    map1.empty();                       //判断空
    map1.clear();                      //清空所有元素
 
    //3.遍历
    for(map<int,string>::iterator iter = map1.begin();iter!=map1.end();iter++)
    {
       int keyk = iter->first;
       string valuev = iter->second;
    }
复制代码

2)set集合
set的含义是集合,它是一个有序的容器,里面的元素都是排序好的支持插入、删除、查找等操作,就像一个集合一样,所有的操作都是严格在logn时间内完成,效率非常高。set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同,set默认是自动排序的,使用方法类似list。

 

4:几种容器的比较

1)vector

内部数据结构:数组。

在末尾增加或者删除元素所需时间与元素数目无关,在中间或者开头增加或者删除元素所需时间是随元素数目呈线性变化。

2):deque

内部数据结构是:数组

随机访问每个元素,所需要的时间为常量。在开头和末尾增加元素所需时间与元素数目无关,在中间增加或删除所需时间随元素数目呈线性变化。

3)list

内部数据结构:双向环状链表

不能随机访问一个元素,可双向遍历,在开头,末尾和中间的任何地方增加或者删除元素所需时间都是常量。

4)set

键和值相等。

键唯一

元素默认按升序排列、

5)map

键唯一,

元素默认按键的升序排列

 

5:关于迭代器失效的问题、小心使用STL中的erase

 先看下面一段代码:

复制代码
 1 #include "stdafx.h"
 2 #include<iostream>
 3 #include<vector>
 4 
 5 using namespace std;
 6 
 7 
 8 int main()
 9 {
10     vector<int> vect;
11     for(int i = 0; i < 10; i++ )
12     {
13         vect.push_back(i);
14     }
15 
16     vector<int>::iterator iter = vect.begin();
17     for(; iter != vect.end(); iter++ )
18     {
19         if( *iter % 2 == 0 )
20         {
21             vect.erase(iter);
22         }
23     }
24 
25     return 0;
26 }
复制代码

咋一看这一段代码好像没有什么问题
但是运行之后的结果为:

程序直接crash了。iter是指向vector这个容器中的某个元素,如果不是在for、while循环中,erase删除元素是没有问题的,但是如果在for、while循环中对容器迭代,删除其中符合条件的所有元素,就可能出现问题。vect.erase(iter)之后,iter及其后面的迭代器已经失效了,不应该再使用这些迭代器了,再执行it++,其行为是未定义的。其它容器也会遇到迭代器失效的问题。

  对于vector被删除元素的迭代器以及指向后面元素的迭代器全部失效。对于deque在首部或尾部删除元素则只会使指向被删除元素的迭代器失效,任何其它位置的插入和删除操作将使指向该容器元素的所有迭代器失效。

  对于list仅有指向被删除元素的迭代器失效。为什么不同容器迭代器失效情况有差别呢?这主要与各容器的数据结构有关。

  那如何在迭代容器时删除其中的元素?各容器通用的做法如下:看下面的例子

复制代码
 1 #include "stdafx.h"
 2 #include<iostream>
 3 #include<vector>
 4 #include<map>
 5 #include<deque>
 6 #include<list>
 7 
 8 using namespace std;
 9 
10 
11 int main()
12 {
13     vector<int> vect;
14     for(int i = 0; i < 10; i++ )
15     {
16         vect.push_back(i);
17     }
18     vector<int>::iterator iter = vect.begin();
19     for(; iter != vect.end(); )
20     {
21          if( *iter % 2 == 0 )
22          {
23             //vect.erase(iter++); //测试 使用vect.erase(iter++) 行不通,我看网上有些人写到这种方式也可行?表示奇怪。
24              iter = vect.erase(iter); 
25          }
26          else
27          {
28              iter++;
29          }
30     }
31 
32    //////////////////////////////下面是对deque的测试////////////////////////////
33     deque<int> myDeque;
34     for( int i = 0; i < 10; i++ )
35     {
36         myDeque.push_back(i);
37     }
38     deque<int>::iterator deiter = myDeque.begin();
39     for(; deiter != myDeque.end();)
40     {
41         if( *deiter % 2 == 0 )
42         {
43             //myDeque.erase(deiter++); //同样这里vect.erase(iter++) 行不通
44             deiter = myDeque.erase(deiter);
45         }
46         else
47         {
48             deiter++;
49         }
50     }
51 
52     //////////////////////////////下面对list的测试//////////////////////
53     list<int> myList;
54     for( int i = 0; i < 10; i++ )
55     {
56         myList.push_back(i);
57     }
58     list<int>::iterator listiter = myList.begin();
59     for(; listiter != myList.end();)
60     {
61         if( *listiter % 2 == 0 )
62         {
63             //myList.erase(listiter++);
64             listiter = myList.erase(listiter); //对于list这两种方式都可以的.因为对于list来说仅有指向被删除元素的迭代器失效,并不会导致所有的迭代器失效.
65         }
66         else
67         {
68             listiter++;
69         }
70     }
71     //////////////////////下面是对map的测试/////////////////////////////
72     map<int,int> myMap;
73     myMap[0] = 1;
74     myMap[1] = 2;
75     myMap[2] = 3;
76     myMap[3] = 4;
77     map<int,int>::iterator it = myMap.begin();
78     for(; it != myMap.end(); )
79     {
80         if( (it->second) % 2 == 0 )
81         {
82             myMap.erase(it++);
83             //it = myMap.erase(it); //对于map这两种方法都可以 c++11 才开始支持返回当前的迭代器,之前的可能没有返回值,所以这种方法不管用
84         }
85         else
86         {
87             it++;
88         }
89     }
90     //////////////set 跟map一样///////////////
91     system("pause");
92     return 0;
93 }
复制代码
芒果YOLOv12改进108:基于QARep提出多种<独家原创结构>:ReNLANQARep, QARep, CSCQARep, C3QARep, C2fQARep等,即插即用提升小目标检测 阅读详情

相关推荐

Zephyr,设备树概述

Zephyr使用设备树(DTS)描述硬件配置,通过设备树源码和绑定文件生成C头文件供开发使用。设备树采用树状结构,节点对应硬件设备,属性描述硬件特性。示例展示了I2C总线及其外设的节点层级关系,包括单元地址、兼容性标识等关键属性。构建系统将设备树转换为devicetree.h中的宏,使开发者能通过DT_前缀宏访问硬件信息,同时保留Kconfig覆盖默认值的能力。

汽车电子软件领域知识分享 720

vector迭代器的begin()和end()

参考博客:http://blog.youkuaiyun.com/kjing/article/details/6936325 迭代器和反向迭代器使用时: end()永远指向最后一个元素的下一个位置; 若容器为空时,迭代器的begin()和end()指向位置相同,而后即使再给容器赋值,迭代器的begin()指向,仍然为空。 错误范例: #include #include void pri

u013089125的专栏 6231

PCIe设备内存访问实战:从ioremap到DMA映射的完整流程解析

本文深入解析了PCIe设备内存访问的完整流程,涵盖从CPU通过ioremap访问设备寄存器,到设备通过DMA映射高效读写主机内存的核心机制。详细探讨了虚拟地址、物理地址与总线地址的转换关系,对比了一致性与流式DMA映射的适用场景及同步要点,并阐述了IOMMU在安全与效率中的作用,为驱动开发者提供了实战代码与关键陷阱分析。

weixin_29201933的博客 504

C++常用的容器:vector、string、deque、stack、queue、list、set、map、hash_set、hash_map等的介绍

本文详细介绍了vector、string、deque、stack、queue、list、set、map以及pair对组的基本语法。

m0_57190374的博客 5096

Yolov5实现道路裂缝检测

Yolov5实现道路裂缝检测 参考代码链接 Github代码链接 基于Pytorch的Yolov5道路裂缝检测程序运行说明。大家可以结合我的说明和原文说明使用,有问题欢迎询问。 文章目录Yolov5实现道路裂缝检测环境要求测试训练自己的数据集1.创建dataset.yaml文件2.创建标签文件3.组织文件路径4.选择模型5.开始训练 环境要求 Python 3.8或之后的版本 还要安装requirements.txt文件中所有依赖包,包括1.7及以上版本的torch $ pip install -r req

qq_26751379的博客 2万+

【学习体会】Lighttools8.4.0:简单光学系统实例

添加球型光源(SphereSource)和表面接收器: 对光线模拟的参数进行设置: 光线追踪-模拟输入 要追踪的光线总数,决定模拟的准确度,总数越多,准确度越高,当然耗时更多 预览光线数量是模拟之后可以看到的示意光线(黑线),一般是100~1000,随意设置 点击,开始模拟: (模拟结果) 如果光线太多,则会出现,可以看到剩余时间 照度分析: 分析-照度显示-光栅图表 ...

LeonJin的博客 1万+

STL vector中的begin方法(3)

原文地址:http://www.cplusplus.com/reference/vector/vector/begin/ public member function std::vector::begin C++98 C++11 iterator begin(); const_iterator begin() const;

roaylchen的博客 4001

深度拆解 ‘High-Frequency Trading’ (HFT) 系统:解析如何在 100 纳秒内完成从网卡到 C++ 策略的响应

在100纳秒内完成从网卡到C++策略的响应,这是一项对技术栈每一个层面都进行极限优化的系统工程。它要求我们深入理解计算机体系结构、操作系统、网络协议和C++语言的底层机制。从物理距离的极致缩短,到高性能网卡和内核旁路技术,再到C++代码中每一个字节、每一个CPU周期的精打细算,HFT系统展现了人类对计算速度的永恒追求。这项技术不仅仅应用于金融交易,其背后的低延迟理念和实现方法,如DPDK、无锁编程、硬件加速等,正在逐渐渗透到其他对延迟敏感的领域,例如电信网络、边缘计算和工业自动化。

weixin_41455464的博客 1039

C++ STL基本容器使用

1:关联容器和顺序容器   c++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector、list、deque等。其中vector表示一段连续的内存地址,基于数组的实现,list表示非连续的内存,基于链表实现。deque与vector类似,但是对于首元素提供删除和插入的双向支持。关联容器主要有map和set。map是key-value形式的,set是单值。map和set只能存放唯一...

weixin_30920513的博客 310

光学系统仿真软件:Finesse_(6).噪声分析与优化

在Finesse中,噪声源的定义可以通过在光学元件的参数中添加噪声项来实现。以下是一个简单的示例,展示了如何在激光器和反射镜中定义噪声源。# 定义噪声传递函数# 绘制噪声传递函数plot NTF1在这个例子中,定义了一个噪声传递函数NTF1,描述了激光器L1到反射镜M1的噪声传递过程。plot NTF1命令绘制了噪声传递函数的频谱图。# 定义耦合路径# 绘制耦合噪声频谱图plot C1在这个例子中,定义了一个耦合路径C1,描述了激光器L1和反射镜M1之间的噪声耦合关系。plot C1。

kkchenjj的博客 872

快速卷积结构FIR数字滤波器的设计与ARM平台实现

本文提出了一种基于快速卷积结构的FIR数字滤波器设计与实现方案。通过Matlab设计了满足特定指标的低通FIR滤波器,采用重叠-保存法和重叠-相加法两种快速卷积算法,将计算复杂度从O(N·M)降低到O(NlogN)。详细介绍了滤波器系数生成、性能验证流程,并提供了ARM平台C语言实现的关键技术,包括定点量化处理。实验结果表明,该方法能有效滤除混合信号中的高频干扰,保留目标1kHz正弦信号,验证了设计方案的有效性。

huanghm88的专栏 121

STL基本容器的使用

基本容器介绍

My_leaf的博客 739

28、沉浸式体验技术:概念、类型与应用

本文全面介绍了沉浸式体验技术的概念、类型与应用。从双边滤波器的图像处理原理切入,系统阐述了VR、AR、MR、ER及数字孪生等核心技术的特点与区别,并通过丰富案例展示了其在商业、医疗、教育、旅游、房地产、物流等多个领域的实际应用。文章还分析了技术融合趋势、硬件升级方向、应用场景拓展潜力,同时探讨了数据处理、网络延迟、隐私安全等挑战及应对策略,最后以流程图和对比表格总结技术发展脉络,展望沉浸式技术推动社会进步的广阔前景。

wind6的博客 377

STL 容器的基本使用方法(stack)

【代码】STL 容器的基本使用方法(stack)

u011247863的博客 161

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++ STL 基本容器使用

C++ STL 基本容器使用 一、STL简介 STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩

奔跑的小乌龟 742

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

STL:C++ STL基本容器的使用

C++ STL基本容器的使用 C++中有两种类型的容器:顺序容器和关联容器。顺序容器主要有vector、list、deque等。其中vector表示一段连续的内存,基于数组实现,list表示非连续的内存,基于链表实现,deque与vector类似,但是对首元素提供插入和删除的双向支持。关联容器主要有map和set。map是key-value形式,set是单值。map和set只能存放唯一的k...

hunter 183

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【C++ STL】set容器的基本使用

set是基于红黑树的有序集合,元素唯一且自动升序,操作复杂度 O(logn),无随机访问;insert()emplace()(插入)、erase()(删除)、find()(查找)、clear()(清空),遍历仅支持双向迭代器;自定义类型需重载运算符,允许重复元素用multiset,修改元素需先删后插。

cool_wait学习专栏 625

【C++100问】深度总结STL基本容器的使用

专栏C++学习笔记 声明 1)本文仅供学术交流,非商用。 2)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 3)此属于第一版本,若有错误,还需继续修正与增删,还望大家多多指点。 4)大家都共享一点点,一起为祖国科研的推进添砖加瓦。 文章目录专栏C++学习笔记声明〇、前言一、C++库引用(Import C++ Library)二、STL(Standard Template Libra...

种树最好的时间是10年前,其次是现在!!! 7059

【C++ STL】map容器的基本使用

map是 C++ STL 中最常用的,核心是存储key-value(键值对),且key唯一、自动排序,底层基于红黑树实现,保证增删查改的时间复杂度稳定在O(logn)。

cool_wait学习专栏 653

C++STL之vector容器:基本使用及模拟实现

vector的使用、vector的模拟实现、迭代器失效、memcpy拷贝问题、动态二维数组的理解

m0_63207201的博客 1373

C++ STL 容器基本使用详解:

C++ STL 容器: C++ STL vector 容器 vector容器的概念 vector在英文中是矢量的意思。 我们知道,一个数组必须要有固定的长度,在开一个数组的时候,这个长度也就被静态地确定下来了。但是vector却是数组的“加强版”,对于一组数据来讲,你往vector里存多少数据,vector的长度就有多大。也就是说,我们可以将其理解为一个“变长数组”。 事实上,vector的实现方...

anana125的博客 5509

STL 容器的基本使用方法(queue/priority_queue)

【代码】STL 容器的基本使用方法(queue/priority_queue)

u011247863的博客 303

C++STL之list容器:基本使用及模拟实现

list的使用、list的模拟实现、const_iterator的实现

m0_63207201的博客 1346

C++ STL基本容器的使用

C++中有两种类型的容器:顺序容器和关联容器。顺序容器主要有vector、list、deque等。其中vector表示一段连续的内存,基于数组实现,list表示非连续的内存,基于链表实现,deque与vector类似,但是对首元素提供插入和删除的双向支持。关联容器主要有map和set。map是key-value形式,set是单值。map和set只能存放唯一的key,multimap和multiset可以存放多个相同的key。 容器类自动申请和释放内存,因此无需new和delete操作。

conanswp的专栏 6万+

【C++ STL】queue队列容器的基本使用

queue(队列)是 C++ STL 中的容器适配器,底层(也可以指定为list),遵循(FIFO) 原则 —— 只能从队尾插入元素,从队首删除 / 访问元素,无法随机访问中间元素,非常适合模拟排队、任务调度等场景。

cool_wait学习专栏 266

C++:09.STL容器的基本介绍和使用

23.STL容器的基本介绍和使用知识点:1. vector 容器2. stack 容器(先进后出)3. queue 容器(先进先出)4. 优先级队列 priority_queue5. list 容器(链表,双向链表)6. set 容器7.函数谓词和函数对象8. multiset容器 知识点: 学习精华:集合底层的数据结构原理 #include <vector> #include <stack> #include <queue> #include <list>

东方升起代码的博客 164
上一篇: STL中容器的使用全面总结
下一篇: 野指针和悬空指针
imJaron
博客等级 码龄11年 121粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值