【C++】vector:容器的别样风采

目录

vector:

vector实例化:

vector构造函数:

vector对象尾插:v1.push_back()

vector迭代器:

vector实例化string类型的对象

vector接口:

begin()+end()//rbegin()+rend()

resize():


vector:

vector是序列容器,表示大小可以变化的数组

其实就是之前学的顺序表

vector实例化:

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{//vector<数据类型>对象名(...)vector<int>v1;vector<int>v2(10,1);//用10个1来初始化v2vector<char>vector<double>vector<string>return 0;}

vector构造函数:

//n个val构造
vector<int>arr(10, 1);
for (auto x:arr)
{cout << x << " ";
}
//拷贝构造
vector<int>arr(10, 1);
vector<int>arr1(arr);
for (auto x : arr)
{cout << x << " ";
}//在c++11规则下,vector还支持类型数组一样的初始化
vector<int>v1={1,2,3,4,5};//这里存在隐式类型转换
//initializer list (6)	
vector (initializer_list<value_type> il,//c++11下,新增的构造函数const allocator_type& alloc = allocator_type());
//它支持用一个花括号来初始化一个对象,这个对象的类型就是'initializer_list'
auto i1={1,2,3,4};//i1的类型是initializer_list,initializer_list可以理解为是一个容器,它支持用一个{}来初始化这个容器,这个容器只支持遍历,不支持插入数据与删除数据
//或者记忆为:vector不能实现参数多变,只能使用initializer_list对象****************************************************************************
vector<int>v1={1,2,3,4,5};//这个存在一个隐式类型转换,原本是构造+拷贝构造,只不过被编译器优化,变成了直接构造
vector<int>v2({1,2,3,4,5});//这里直接将参数传给initializer_list构造函数

vector对象尾插:v1.push_back()

  vector<int>v1;v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);for (int i=0;i<v1.size();i++){cout << v1[i] << " ";}
//assign
vector<int>v1 = {1,2,3,4,5};
v1.assign({10,20,30});//为v1分配一个新空间, 并把10,20,30赋值给v1,并修改v1的size
for (auto x : i1)
{cout << x << " ";
}
cout << endl;//insert
//1:
v1.insert(v1.begin(),10);//在当前位置插入一个值,不能输坐标,只能用迭代器
for (auto e : v1)
{cout << e << " ";
}
cout << endl;
//2:
v1.insert(v1.begin(), 10,0);//在当前位置,插入10个0
for (auto e : v1)
{cout << e << " ";
}
cout << endl;
//3:
v1.insert(v1.begin(), v2.begin(), v2.end());//在当前位置,插入这一迭代器区间的值
for (auto e : v1)
{cout << e << " ";
}
cout << endl;//erase
v1.erase(v1.begin());//删除迭代器位置的值
for (auto e : v1)
{cout << e << " ";
}
cout << endl;v1.erase(v1.begin(),v1.end());//删除某一迭代器区间的值
for (auto e : v1)
{cout << e << " ";
}
cout << endl;//shrink_to_fit
vector<int>v1(10);
cout << v1.size() << endl;
cout << v1.capacity() << endl;v1.resize(5);
cout << v1.size() << endl;
cout << v1.capacity() << endl;v1.shrink_to_fit();//将空间缩容到与当前数据个数相同的大小
cout << v1.size() << endl;
cout << v1.capacity() << endl//data
vector<int>v1 = { 1,2,3,4,5,6,7 };
int* p = v1.data();//返回指向这一数组的指针for (int i=0;i<v1.size();i++)
{cout << (*p) << endl;p++;
}//emplace
vector<int>v1 = { 1,2,3,4,5,6,7 };
auto it = v1.begin();
v1.emplace(it,10);//在当前迭代器的位置插入数据
for (auto e : v1)
{cout << e << " ";
}//emplace
vector<int>v1 = { 1,2,3,4,5,6,7 };
v1.emplace_back(100);//在容器末尾插入数据
for (auto e : v1)
{cout << e << " ";
}
vector<int>v1 = {1,2,3,4,5,6,7};
v1[9]++;//[]越界直接断言报错vector<int>v1 = {1,2,3,4,5,6,7};
cout << v1.at(9) << endl;//抛异常

vector迭代器:

  vector<int>v1;v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);vector<int>::iterator it1 = v1.begin();//it1为迭代器名while (it1!=v1.end()){cout << *it1 << " ";++it1;}
*************************************
//迭代器失效
void insert(iterator pos, const T& x)
{assert(pos>=_start&&pos<=_finish);if (_finish==_endofstorage){size_t len = pos - _start;//迭代器失效->因为一些原因,迭代器不可用reserve(capacity()==0?4:capacity()*2);pos = _start + len;//虽然更新了pos,但是对形参的修改不会影响实参}iterator i = _finish - 1;while (i>=pos){*(i + 1) = *i;--i;}*pos = x;++_finish;
}if (it!=v1.end())
{it = v1.insert(it, 10 * x);cout << *it << endl;//迭代器失效
}
//it做为实参,将值传给形参pos,当不需扩容时,不会存在迭代器失效的问题
//若需要扩容,虽然我们对pos进行了更新,但是对作为形参的pos进行修改不会影响到实参it//迭代器失效的两种原因://1.扩容引起的野指针失效//2.删除数据,迭代器已经不是指向之前的位置了,这就导致可能会造成逻辑错误

vector实例化string类型的对象

vector<string>vstr;
string s1 = "张三";
vstr.push_back(s1);
vstr.push_back("李四");//单参数构造函数支持隐式类型转换vector<string>vstr;
string s1 = "张三";vstr.push_back(s1);
vstr.push_back("李四");for (const auto& e:vstr)//auto&是为了减少拷贝,const是为了防止数据被修改
{//e[0]++;cout << e << " ";
}vstr[0] += 'x';//vstr[0]表示访问第一个string类型的值,就是张三,+='x'就表示在张三后面加上一个'x'vstr[0] +="hello";//为什么支持+=?因为实例化的是string类型,这里调用的实际上是string类型的+=vstr[0][1]++;vstr[0][1]++;vstr[0][1]++;vstr[1][1]++;vstr[1][1]++;vstr[1][1]++;for (const auto& x:vstr){cout << x;}

vector接口:

begin()+end()//rbegin()+rend()

//与string类中的接口类似
vector<int>arr(10,1);
vector<int>arr1(arr.begin(), arr.end());//迭代器初始化构造
for (auto x:arr1)
{cout << x;
}

都与string类中的接口用法一样。

resize():

改变的是对象中有效字符的个数,当改变的值大于当前空间值时,会增容。

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

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

相关文章

大语言模型 15 - Manus 超强智能体 开源版本 OpenManus 案例与原理深入解析

写在前面 Manus 是由中国初创公司 Monica.im 于 2025 年 3 月推出的全球首款通用型 AI 智能体&#xff08;AI Agent&#xff09;&#xff0c;旨在实现“知行合一”&#xff0c;即不仅具备强大的语言理解和推理能力&#xff0c;还能自主执行复杂任务&#xff0c;直接交付完整成…

【node.js】安装与配置

个人主页&#xff1a;Guiat 归属专栏&#xff1a;node.js 文章目录 1. Node.js简介1.1 Node.js的特点1.2 Node.js架构 2. Node.js安装2.1 下载和安装方法2.1.1 Windows安装2.1.2 macOS安装2.1.3 Linux安装 2.2 使用NVM安装和管理Node.js版本2.2.1 安装NVM2.2.2 使用NVM管理Node…

Neo4j(一) - Neo4j安装教程(Windows)

文章目录 前言一、JDK与Neo4j版本对应关系二、JDK11安装及配置1. JDK11下载2. 解压3. 配置环境变量3.1 打开系统属性设置3.2 新建系统环境变量3.3 编辑 PATH 环境变量3.4 验证环境变量是否配置成功 三、Neo4j安装&#xff08;Windows&#xff09;1. 下载并解压Neo4j安装包1.1 下…

深信服golang面经

for range 中赋值的变量&#xff0c;这个变量指向的是真实的地址吗&#xff0c;还是临时变量 不是真实地址&#xff0c;是临时变量 package mainimport "fmt"func main() {slice : []int{4, 2, 3}for _, v : range slice {fmt.Println(v, &v) // 这里的 v 是临…

PLC双人舞:profinet转ethernet ip网关奏响施耐德与AB的协奏曲

PLC双人舞&#xff1a;ethernet ip转profinet网关奏响施耐德与AB的协奏曲 案例分析&#xff1a;施耐德PLC与AB PLC的互联互通 在现代工业自动化中&#xff0c;设备之间的互联互通至关重要。本案例旨在展示如何通过北京倍讯科技的EtherNet/IP转Modbus网关&#xff0c;将施耐德P…

链接家里电脑

要在外网访问家里的电脑&#xff08;或NAS&#xff09;&#xff0c;主要有 5种主流方法&#xff0c;各有优缺点&#xff0c;适用于不同需求。以下是详细方案和操作指南&#xff1a; 一、方案对比速查表 方法适用场景速度安全性难度是否需要公网IP远程桌面&#xff08;RDP&…

VS Code开源AI编辑器:一场编程革命的新起点

在2025年5月19日&#xff0c;微软发布了一则激动人心的消息——VS Code将开源其AI编辑器组件&#xff0c;特别是GitHub Copilot Chat扩展。正如微软官方博客所宣告的&#xff1a;“我们相信代码编辑器的未来应该是开放的&#xff0c;并由AI驱动。” 为什么现在开源&#xff1f…

51c嵌入式※~合集7~Linux

我自己的原文哦~ https://blog.51cto.com/whaosoft/13926843 一、u-boot和bootloader~区别 Bootloader 比Bootloader从字面上来看就是启动加载的意思。用过电脑的都知道&#xff0c;windows开机时会首先加载bios&#xff0c;然后是系统内核&#xff0c;最后启动完毕。那…

深度学习实战 04:卷积神经网络之 VGG16 复现三(训练)

在后续的系列文章中&#xff0c;我们将逐步深入探讨 VGG16 相关的核心内容&#xff0c;具体涵盖以下几个方面&#xff1a; 卷积原理篇&#xff1a;详细剖析 VGG 的 “堆叠小卷积核” 设计理念&#xff0c;深入解读为何 332 卷积操作等效于 55 卷积&#xff0c;以及 333 卷积操作…

Ubuntu 20.04之Docker安装ES7.17.14和Kibana7.17.14

你需要已经安装如下运行环境: Ubuntu 20.04 docker 28 docker-compose 1.25 一、手动拉取镜像 docker pull docker.elastic.co/kibana/kibana:7.17.14docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.14 或者手动导入镜像 docker load -i es7.17.14.ta…

实时技术方案对比:SSE vs WebSocket vs Long Polling

早期网站仅展示静态内容,而如今我们更期望:实时更新、即时聊天、通知推送和动态仪表盘。 那么要如何实现实时的用户体验呢?三大经典技术各显神通: SSE(Server-Sent Events):轻量级单向数据流WebSocket:双向全双工通信Long Polling(长轮询):传统过渡方案假设目前有三…

测试开发面试题:Python高级特性通俗讲解与实战解析

前言&#xff1a;为什么测试工程师必须掌握Python高级特性&#xff1f; 通俗比喻&#xff1a; 基础语法就像“锤子”&#xff0c;能敲钉子&#xff1b;高级特性就像“瑞士军刀”&#xff0c;能应对复杂场景&#xff08;如自动化框架、高并发测试&#xff09;。面试官考察点&a…

C语言-9.指针

9.1指针 9.1-1取地址运算:&运算符取得变量的地址 运算符& scanf(“%d”,&i);里的&获取变量的地址,它们操作数必须是变量int i;printf(“%x”,&i);地址的大小是否与int相同取决于编译器int i;printf(“%p”,&i); &不能取的地址不能对没有地址的…

【C++】Vcpkg 介绍及其常见命令

Vcpkg 简介 Vcpkg 是微软开发的一个跨平台的 C/C 依赖管理工具&#xff0c;用于简化第三方库的获取、构建和管理过程。 主要特点 跨平台支持&#xff1a;支持 Windows、Linux 和 macOS开源免费&#xff1a;MIT 许可证大型库集合&#xff1a;包含超过 2000 个开源库简化集成&…

Unity3D 动画文件优化总结

前言 在Unity3D中&#xff0c;动画文件的压缩和优化是提升性能的重要环节&#xff0c;尤其在移动端或复杂场景中。以下是针对Animation Clip和Animator Controller的优化方法总结&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一…

前端工程的相关管理 git、branch、build

环境配置 标准环境打包 测试版&#xff1a;npm run build-test 预生产&#xff1a;npm run build-preview 正式版&#xff1a;npm run build 建议本地建里一个 .env.development.local 方便和后端联调时修改配置相关信息。 和 src 同级有一下区分环境的文件&#xff1a; .env.d…

VAPO:视觉-语言对齐预训练(对象级语义)详解

简介 多模态预训练模型(Vision-Language Pre-training, VLP)近年来取得了飞跃发展。在视觉-语言模型中,模型需要同时理解图像和文本,这要求模型学习二者之间的语义对应关系。早期方法如 VisualBERT、LXMERT 等往往使用预先提取的图像区域特征和文本词嵌入拼接输入,通过 T…

docker运行Redis

创建目录 mkdir -p /home/jie/docker/redis/{conf,data,logs}添加权限 chmod -R 777 /home/jie/docker/redis创建配置文件 cat > /home/jie/docker/redis/conf/redis.conf << EOF # 基本配置 bind 0.0.0.0 protected-mode yes port 6379# 安全配置 密码是root require…

初识 java

目录 前言 一、jdk&#xff0c;JRE和JVM之间的关系 二、JVM的内存划分 前言 初步了解 jdk&#xff0c;JRE&#xff0c;JVM 之间的关系&#xff0c;JVM 的内存划分。 一、jdk&#xff0c;JRE和JVM之间的关系 jdk 是 java 开发工具集&#xff0c;包含JRE&#xff1b; JRE 是…

关于百度地图JSAPI自定义标注的图标显示不完整的问题(其实只是因为图片尺寸问题)

下载了几个阿里矢量图标库里的图标作为百度地图的自定义图标&#xff0c;结果百度地图显示的图标一直不完整。下载的PNG图标已经被正常引入到前端代码&#xff0c;anchor也设置为了图标底部中心&#xff0c;结果还是显示不完整。 if (iconUrl) {const icon new mapClass.Icon(…