C++之vector::insert与vector::insert用法区别总结(二百二十二)

news2024/11/25 10:09:05

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之vector::insert与vector::insert用法区别。

在C++的std::vector容器中,insertpush_back是两个不同的方法,用于向向量中添加元素的方式有所差异。

  1. insert方法允许在向量的任意位置插入一个或多个元素。它接受两个迭代器参数,第一个参数指定了插入位置,第二个参数指定了要插入的元素。插入后,原有的元素会向后移动,腾出空间给新插入的元素。insert方法还可以接受一个范围的迭代器,用于指定要插入的一段元素。

  2. push_back方法用于在向量的末尾添加单个元素。它接受一个参数,即要添加的元素。新元素被追加到向量的最后,不会影响其他元素的位置。

主要区别如下:

  • insert可以在向量的任意位置插入元素,而push_back只能在末尾追加元素。
  • insert可以一次性插入多个元素,而push_back只能插入一个元素。
  • insert会导致插入点之后的元素向后移动,而push_back不会影响其他元素的位置。

如果需要在指定位置插入或插入多个元素,可以使用insert方法。如果只需要在末尾添加单个元素,可以使用push_back方法。

2.应用实例

v1.0 堆上申请内存,push_back尾部插入

#include <iostream>
#include <vector>

int main()
{
    std::vector<std::string>* buf;
    buf = new std::vector<std::string>();

    std::string buf1 = "11111111";
    (*buf).push_back(buf1);
    printf("xxx---------> %s(), line = %d, buf = %s\n",__FUNCTION__,__LINE__, (*buf).back().c_str());
    delete buf;
  }

v2.0 栈上申请内存,push_back尾部插入

  std::vector<std::string> buf(100);
  std::string buf1 = "222222222!";
  buf.push_back(buf1);  //它是插入最后一个元素
  printf("xxx---------> %s(), line = %d, buf[0] = %s\n",__FUNCTION__,__LINE__, buf[0].c_str());
  printf("xxx---------> %s(), line = %d, buf[100] = %s\n",__FUNCTION__,__LINE__, buf[100].c_str());
  printf("xxx---------> %s(), line = %d, buf.front = %s\n",__FUNCTION__,__LINE__, buf.front().c_str());
  printf("xxx---------> %s(), line = %d, buf.back = %s\n",__FUNCTION__,__LINE__, buf.back().c_str());

v3.0 push_back从尾部插入

#include <iostream>
#include <vector>


void set_pointer(std::vector<std::string> *buf){
  std::string buf1 = "Hello Pointer!";
  //v1.0 从尾部插入
  (*buf).push_back(buf1);
}

int main() {
  //std::vector<std::string> buf(0);//也是正确的,自动扩容
  std::vector<std::string> buf(100);
  set_pointer(&buf);
  printf("xxx---------> %s(), line = %d, buf[0] = %s\n",__FUNCTION__,__LINE__, buf[0].c_str());
  printf("xxx---------> %s(), line = %d, buf[100] = %s\n",__FUNCTION__,__LINE__, buf[100].c_str());
  printf("xxx---------> %s(), line = %d, buf.front = %s\n",__FUNCTION__,__LINE__, buf.front().c_str());
  printf("xxx---------> %s(), line = %d, buf.back = %s\n",__FUNCTION__,__LINE__, buf.back().c_str());

  return 0;
}

v4.0 insert从begin开始位置插入

#include <iostream>
#include <vector>


void set_pointer(std::vector<std::string> *buf){
  std::string buf1 = "Hello Pointer!";
  //v2.0 从begin头部位置插入.
  (*buf).insert((*buf).begin(), buf1);
}

int main() {
  //std::vector<std::string> buf(0);//也是正确的,自动扩容
  std::vector<std::string> buf(100);
  set_pointer(&buf);
  printf("xxx---------> %s(), line = %d, buf[0] = %s\n",__FUNCTION__,__LINE__, buf[0].c_str());
  printf("xxx---------> %s(), line = %d, buf[100] = %s\n",__FUNCTION__,__LINE__, buf[100].c_str());
  printf("xxx---------> %s(), line = %d, buf.front = %s\n",__FUNCTION__,__LINE__, buf.front().c_str());
  printf("xxx---------> %s(), line = %d, buf.back = %s\n",__FUNCTION__,__LINE__, buf.back().c_str());

  return 0;
}

v5.0 对指针pbuf做insert赋值操作,即对它指向的buf对象赋值操作.

#include <iostream>
#include <vector>
#include <cstring>

int main() {
  //1.在栈上创建vector<std::string>内存,并分配100个字节.
  std::vector<std::string> buf(100);
  buf.insert(buf.begin(),"11111");

  //2.指针pbuf指向buf的vector<string>对象buf.
  std::vector<std::string> *pbuf = &buf;

  pbuf->insert(buf.begin()+1,"22222222");

  printf("buf[0] = %s\n",buf.front().data());
  printf("buf[1] = %s\n",buf[1].data());
  printf("(*pbuf)[1] = %s\n",(*pbuf)[0].data());
  printf("(*pbuf)[1] = %s\n",(*pbuf)[1].data());

  return 0;
}


因为指针pbuf指向buf,所以对pbuf插入字符串,就是对buf插入操作,buf才是真正的实体.

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

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

相关文章

Loguru:功能强大、简单易用的Python日志库

文章目录 Loguru:Python的日志库安装 Loguru基本用法配置 Loguruadd() 语句remove() 语句设置日志文件保留日志的等级设置控制台日志显示等级Loguru:Python的日志库 Loguru 是一个功能强大、简单易用的日志库,可以让 Python 的日志记录变得更加轻松。它提供了丰富的功能和配…

Kotlin | 在for、forEach循环中正确的使用break、continue

文章目录 for循环中使用break、continueLabel标签forEach中如何退出循环资料 Kotlin 有三种结构化跳转表达式&#xff1a; return&#xff1a;默认从最直接包围它的函数或者匿名函数返回。break&#xff1a;终止最直接包围它的循环。continue&#xff1a;继续下一次最直接包围…

【软考复习系列】计算机网络易错知识点记录

参考文章&#xff1a;图解路由器&#xff1a;这玩意儿能连接全世界的网络&#xff1f; - 知乎 (zhihu.com) 宏内核和微内核 宏内核应该叫单内核或者单核。在这种单核的设计中&#xff0c;内核是一个大的整体&#xff0c;所有内核服务都运行在一个地址空间中&#xff0c;函数之…

软件设计模式系列之九——桥接模式

1 模式的定义 桥接模式是一种结构型设计模式&#xff0c;它用于将抽象部分与其实现部分分离&#xff0c;以便它们可以独立地变化。这种模式涉及一个接口&#xff0c;它充当一个桥&#xff0c;使得具体类可以在不影响客户端代码的情况下改变。桥接模式将继承关系转化为组合关系…

Matlab图像处理-强度分层法

强度分层法 强度分层技术是最简单的伪彩色图像处理方法之一。 如果将一幅图像被描述为空间坐标(x,y) 的强度函数f(x,y) &#xff0c;则分层的方法可以看作是将一些平面平行于图像坐标平面(x,y) &#xff0c;然后将每个平面在相交区域切割图像函数。下图展示了使用平面将图像函…

vue+axios+el-progress(elementUI组件)实现下载进度条实时监听(小白简洁版)

一、实现效果 二、实现方式 方案&#xff1a;使用axios方法onDownloadProgress方法监听下载进度 使用此方式的前提&#xff01;&#xff01;&#xff01;请让后端在响应头中加上content-length&#xff0c;存放下载文件的总大小&#xff0c;如下图&#xff1a; 三、代码 1、进…

【Git】03-GitHub

文章目录 1. GitHub核心功能2. GitHub搜索项目3. GitHub搭建个人博客4. 团队项目创建5. git工作流选择5.1 需要考虑的因素5.2 主干开发5.2 Git Flow5.3 GitHub Flow5.4 GitLab Flow(带生产分支)5.4 GitLab Flow(带环境分支)5.4 GitLab Flow(带发布分支) 6. 分支集成策略7. 启用…

redis 集群(cluster)

1. 前言 我们知道&#xff0c;在Web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999% 等等&#xff09;。但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xf…

如何将本地的项目上传到Git

一、GitHub or GitLab or Gitee创建一个新的仓库 二、仓库路径创建成功后&#xff0c;将本地项目上传到git 1. 进入本地项目所在文件夹位置&#xff0c;右击 2.出现git命令框 输入git init 在当前项目的目录中生成本地的git管理&#xff08;会发现在当前目录下多了一个.git文件…

git 查看当前版本号

你看&#xff0c;那个人好像一条狗哎。 ——周星驰 《大话西游》 要查看当前 Git 仓库的版本号&#xff0c;您可以使用以下命令&#xff1a; git log --oneline -n 1 这会显示最近一次的提交信息&#xff0c;包括提交的哈希值&#xff08;版本号&#xff09;和提交的摘要信息…

Jmeter接口测试简易步骤

使用Jmeter接口测试 1、首先右键添加一个线程组&#xff0c;然后我们重命名接口测试 2、在线程组上添加一个Http默认请求&#xff0c;并配置服务器的IP地址端口等信息 3、在线程组中添加一个HTTP请求&#xff0c;这里我们重命名“增加信用卡账户信息接口” 4、配置接口请求信息…

Java基础入门·对存储文件File的相关操作

前言 File类获取的方法 getName() | getPath() File getAbsoluteFile() | File getParentFile() long length() File类遍历方法 IO流对象的分类 1.按照操作的文件类型分类 2.按照数据的流向分类 IO流对象的分类归纳 OutputStream 字节输出流写入文件的步骤 追加写入 F…

迅为iTOP-RK3568开发板Sobel 算子边缘检测

本小节代码在配套资料“iTOP-3568 开发板\03_【iTOP-RK3568 开发板】指南教程 \04_OpenCV 开发配套资料\32”目录下&#xff0c;如下图所示&#xff1a; Sobel (索贝尔)算子是计算机视觉领域的一种重要处理方法。主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检…

计算机专业毕业设计项目推荐07-科研成果管理系统(JavaSpringBoot+Vue+Mysql)

科研成果管理系统&#xff08;JavaSpringBootVueMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现****最后想说的****联系方式** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以…

寄存器与内存详解

目录 CPU、寄存器、内存之间的关系 寄存器 通用寄存器 EAX寄存器 EBX寄存器 ECX寄存器 EDX寄存器 EBP寄存器 ESP寄存器 ESI寄存器 EDI寄存器 总结 段寄存器 分段内存管理机制 段与段寄存器 指令指针寄存器EIP 标志寄存器 内存 虚拟内存 大端存储与小端存储…

大数据Flink(八十三):SQL语法的DML:With、SELECT WHERE、SELECT DISTINCT 子句

文章目录 SQL语法的DML:With、SELECT & WHERE、SELECT DISTINCT 子句 一、DML:With 子句

使用 Docker 安装 Elasticsearch (本地环境 M1 Mac)

Elasticsearchkibana下载安装 docker pull elasticsearch:7.16.2docker run --name es -d -e ES_JAVA_OPTS“-Xms512m -Xmx512m” -e “discovery.typesingle-node” -p 9200:9200 -p 9300:9300 elasticsearch:7.16.2docker pull kibana:7.16.2docker run --name kibana -e EL…

IntelliJ IDEA使用——常用快捷键(Windows版)

文章目录 版本说明搜索操作层级关系查看光标选择代码定位代码操作Git操作编辑器操作 版本说明 当前的IntelliJ IDEA 的版本是2021.2.2&#xff08;下载IntelliJ IDEA&#xff09; ps&#xff1a;不同版本一些图标和设置位置可能会存在差异&#xff0c;但应该大部分都差不多。…

【LLM工程篇】deepspeed | Megatron-LM | fasttransformer

note 当前比较主流的一些分布式计算框架 DeepSpeed、Megatron 等&#xff0c;都在降低显存方面做了很多优化工作&#xff0c;比如&#xff1a;量化、模型切分、混合精度计算、Memory Offload 等 文章目录 note大模型参数计算1. 模型参数单位2. 训练显存计算3. 推理显存计算 大…

nodejs中的错误类型及捕获处理

nodejs中的错误类型及捕获处理 在 node 中&#xff0c;提供了 error 模块&#xff0c;并且内置了标准的 JavaScript 错误&#xff0c;本文将介绍在node中错误类型以及如何捕获。 错误类型 js错误 标准的js错误&#xff0c;跟在浏览器中运行js时提示的错误类型一样 RangeEr…