C++之vector::insert与vector::insert应用总结(二百二十二)

news2024/11/18 19:50:50

简介: 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/1032394.html

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

相关文章

七天学会C语言-第七天(结构体)

1.定义结构体 例 1&#xff1a;把一个学生的信息(包括学号、姓名、性别、住址等 4 项信息) 放在一个结构体变量中&#xff0c;然后输出这个学生的信息。 #include <stdio.h>struct Student {int student_id;char name[30];char gender;char address[60]; };int main() …

Vue脚手架一站式搭建项目

一、什么是vue-cli 1.1如果你只是简单写几个Vue的Demo程序&#xff0c;那么你不需要VueCLI脚手架。 1.2.如果你在开发大型项目&#xff0c;那么你需要&#xff0c;并且必然需要使用VueCLI。 1.2.1使用Vue.js开发大型应用时&#xff0c;我们需要考虑代码目录结构、项目结构和…

【2023研电赛】华东赛区一等奖:基于EtherCAT通信有限时间位置收敛伺服系统

本文为2023年第十八届中国研究生电子设计竞赛作品分享&#xff0c;参加极术社区的【有奖活动】分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&#xff01;&#xff0c;分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&#xff01; 基于…

MQ - 22 Kafka集群架构设计与实现

文章目录 导图概述数据可靠性副本拉取 Leader 数据动态维护可用副本集合控制 Leader 切换和数据截断安全控制可观测性总结导图 概述 MQ - 15 集群篇_如何构建分布式的消息队列集群(下)说了基于 ZooKeeper 和 KRaft 来构建集群的两种方式,在这里就不再重复。 这里我们详细分…

【GIS】地理坐标系WGS84、GCJ-02、BD-09、GCS2000

地理坐标系又可分为 参心坐标系 和 地心坐标系&#xff0c;常见的参心坐标系北京54、西安80&#xff0c;常见的地心坐标系有WGS84、GCJ-02、BD-09、GCS2000 地心坐标系 WGS84&#xff08;World Geodetic System 1984&#xff09; WGS84是为 GPS 全球定位系统建立的坐标系统&…

工作流 Flowable 的使用

一、BPMN 业务流程建模与标注 通过 Status&#xff08;状态&#xff09; 字段维护流程状态&#xff0c;流程负责的审批人可能也是 Hard Code&#xff08;硬编码&#xff09;会出现以下问题&#xff1a; 1.流程健壮性差&#xff0c;但凡出现人员变动&#xff0c;或者组织结构调…

数据结构与算法(六)--链表的遍历,查询和修改,删除操作

一、前言 上篇文章我们了解了链表的概念以及链表底层的搭建以及向链表中添加元素的操作。本次我们继续学习链表剩余的操作&#xff1a;遍历&#xff0c;查询和修改、删除操作。 二、链表查询以及遍历 ①获得链表的第index(0-based)个位置的元素&#xff08;不常用&#xff0…

微信定时发圈、跟圈是怎么操作的?

对于私域运营来说&#xff0c;手上都会有几个微信账号需要管理运营&#xff0c;每天需发圈、评论等操作都已经占据大量的时间了&#xff0c;更别说分配时间去做其他的功能做了。 自从用了微信管理工具&#xff0c;提高了运营的工作效率、而且操作非常地简单&#xff0c;还不用…

梯形加减速点动功能块(博途SCL)

梯形速度曲线相关算法介绍,请查看下面博客文章,这里不再赘述,受水平和能力所限文中难免出现错误和不足之处,欢迎大家批评指正,同时感谢大家订阅。 SMART PLC斜坡函数 SMART PLC斜坡函数功能块(梯形图代码)_RXXW_Dor的博客-CSDN博客斜坡函数Ramp的具体应用可以参看下面…

AI人体行为分析:玩手机/打电话/摔倒/攀爬/扭打检测及TSINGSEE场景解决方案

一、AI人体行为分析技术概述及场景 人体姿态分析/行为分析/动作识别AI算法&#xff0c;是一种利用人工智能技术对人体行为进行检测、跟踪和分析的方法。通过计算机视觉、深度学习和模式识别等技术&#xff0c;可以实现对人体姿态、动作和行为的自动化识别与分析。 在场景应用…

小米笔试题——01背包问题变种

这段代码的主要思路是使用动态规划来构建一个二维数组 dp&#xff0c;其中 dp[i][j] 表示前 i 个产品是否可以组合出金额 j。通过遍历产品列表和可能的目标金额&#xff0c;不断更新 dp 数组中的值&#xff0c;最终返回 dp[N][M] 来判断是否可以组合出目标金额 M。如果 dp[N][M…

Opencv-图像噪声(均值滤波、高斯滤波、中值滤波)

图像的噪声 图像的平滑 均值滤波 均值滤波代码实现 import cv2 as cv import numpy as np import matplotlib.pyplot as plt from pylab import mplmpl.rcParams[font.sans-serif] [SimHei]img cv.imread("dog.png")#均值滤波cv.blur(img, (5, 5))将对图像img进行…

Linux内核SPI子系统驱动框架详解

目录 1 spi子系统整体架构图 2 SPI控制器驱动和SPI设备驱动软件架构 3 SPI控制器驱动的整理流程 4 SPI发送数据过程 5 SPI设备驱动 6spidev万能驱动 7 费曼学习法&#xff1a;我录制了一个SPI子系统驱动框架讲解视频 参考文献&#xff1a; 1 spi子系统整体架构图 如上图…

资管巨头贝莱德增持矿企股份,机构资金正在慢慢进入比特币经济……

在比特币减半前夕&#xff0c;比特币挖矿企业股价今年大幅上涨&#xff0c;甚至比BTC上涨幅度还高数倍&#xff0c;非常强势。而据富途最新股权披露数据显示&#xff0c;截至2023年8月31日&#xff0c;已经有3家机构投资者增持了加密挖矿服务商比特小鹿&#xff08;Bitdeer&…

[面试] k8s面试题 2

文章目录 核心组件1.什么是 Kubernetes 中的控制器&#xff08;Controller&#xff09;&#xff1f;请提供一些常见的控制器类型。2.请解释一下 Kubernetes 中的 Ingress 是什么&#xff0c;以及它的作用。3.如何通过命令行在 Kubernetes 中创建一个 Pod&#xff1f;4.Stateful…

Jmeter配置性能监控插件

一、版本不兼容时&#xff0c;有报错 1、当jmeter版本比较高时&#xff0c;只需要从官网安装jmeter-plugins-manager-1.10.jar一个包 2、当jmeter版本较低时&#xff0c;安装JMeterPlugins-Extras-1.4.0.zip、JMeterPlugins-Standard-1.4.0.zip内两个jar包 3、服务器上传文件…

【链表】删除链表的中间节点-力扣2095题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

Latex Overleaf 写作问题记录

Latex & Overleaf 写作问题记录 公式换行及排列整齐 \begin{equation} \begin{split}Y & a1\\&b2 \end{split} \end{equation}顶格 \noindent求和符号 求和符号&#xff08;上下限上下排列&#xff09; \sum\limlits求和符号&#xff08;上下限右边排列&#…

数据库模块

这里写目录标题 一.数据库设计确定实体之间的关系创建数据表编写实体类二.封装数据库操作封装DButil针对文件的增删查改操作进行一个封装初始化数据库插入文件查询文件删除文件 一.数据库设计 确定实体之间的关系 因为我们要做的是一个文件搜索功能,我们这里的实体,就是文件,…

02-数据结构-线性表

线性表的特点&#xff1a; (1)存在惟一一个被称为"第一个"的数据元素 (2)存在惟一一个被称为"最后一个"的数据元素 (3)除第一个之外&#xff0c;集合中每一个数据元素均只有一个前驱 (4)除最后一个之外&#xff0c;集合中每个数据均只有一个后继 线性表是…