c++中vector初始化的一个有趣的细节问题

news2025/1/12 18:10:30

vector的初始化,相信会写c++的人都很熟悉,c++11对此也改进了很多,更方便。

以下是使用vector初始化的几个例子:

  1. 从数组初始化vector:
int arr[] = {1, 2, 3, 4, 5};
vector<int> vec(arr, arr + sizeof(arr) / sizeof(int));

  1. 使用默认值初始化vector:
vector<int> vec(5, 0); // 创建一个大小为5,值为0的vector

  1. 使用另一个vector初始化vector:
vector<int> vec1 = {1, 2, 3, 4, 5};
vector<int> vec2(vec1); // 使用vec1初始化vec2

  1. 使用迭代器初始化vector:
vector<int> vec(arr, arr + sizeof(arr) / sizeof(int));
vector<int> vec2(vec.begin() + 1, vec.end() - 1); // 使用vec中的第2个到倒数第2个元素初始化vec2

  1. 使用列表初始化的方式:
vector<int> vec = {1, 2, 3, 4, 5};

=========分割线==================分割线==================

那么,我下面提出的问题,就比较细节了,请观察下面两段代码,有什么区别:

    //代码1
	std::vector<std::vector<CAMFeature>*> vpvCams(8, new std::vector<CAMFeature>());


    //代码2
	std::vector<std::vector<CAMFeature>*> vpvCams(8, nullptr);

	for (size_t i = 0; i < vpvCams.size(); ++i)
	{
		vpvCams[i] = new std::vector<CAMFeature>();
	}

这里,我们在vector的内部定义了一个指针,其实指针的类型无所谓,我这里为了方便直接复制粘贴过来了。

那么,想问一下,这两段代码的效果是一样的吗?先不看答案,思考一下呗。

=========分割线==================分割线==================

为了防止你一下子就看到答案,这里先举一个类似的例子占用一点空间,并且这个例子更具体,更有说服性,下面也将用这个例子来解释说明:

#include <vector>
#include <iostream>

using namespace std;

int main()
{
	//代码1
	std::vector<int*> vPInt(8, new int());


	//代码2
	std::vector<int*> vPInt2(8, nullptr);

	for (size_t i = 0; i < vPInt2.size(); ++i)
	{
		vPInt2[i] = new int();
	}


	for (int i = 0; i < 8; ++i)
	{
		cout << &(*vPInt[i]) << std::endl;
	}

	cout << "\n";

	for (int i = 0; i < 8; ++i)
	{
		cout << &(*vPInt2[i]) << std::endl;
	}

	return 0;
}

代码1和代码2,同样初始化了一个vector,但是他们初始化的方法有区别,现在的问题是,他们的效果相同吗?

我们分别输出了两种初始化方式下,输出容器中的结果,因为指针如果直接使用cout输出会输出指针对应的结果,所以我们取了一次地址。

先公布一下答案:不同!

从结果中可以看到,两种初始化方式的结果是不同的,第一种初始化方式,vecor容器中存储的指针是相同的,也就是说,new vector这句话实际上只执行了一次,然后拷贝到各个容器,而第二种初始化方式才是我们需要的,分别对每一个指针进行初始化。

这说明,不应当在vecor初始化的时候,对指针进行new,因为那个结果不是我们想要的!!

而如果是其他正常的类型,不是指针的话,那上面两种初始化的结果相同:

//方法1
vector<int> vec(5, 10); // 创建一个大小为5,值为10的vector

//方法2
vector<int> vec(5); // 创建一个大小为5
for (int i = 0; i < 5; ++i)
{
    vec[i] = 10;
}

虽然写c++很多年了,一直没有注意到这个细节,说来惭愧,不过最近在做项目的过程中发现了这个问题,特此纪念一下。

欢迎交流与讨论。

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

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

相关文章

定时清理文件脚本

一、定时清理文件 编写一个bat脚本。新建一个文本文档&#xff08;txt文件&#xff09;&#xff0c;在里面输入echo offdel /f /s /q E:\temp\*.*&#xff0c;E代表E盘&#xff0c;temp是E盘下的需要清理的文件夹&#xff0c;运行脚本后&#xff0c;就是清理E:\temp文件夹下的…

Win下查看端口占用情况并释放该端口

开发中&#xff0c;经常会遇到端口意外被占用&#xff0c;需释放该端口的问题。一般解决思路是找到被占用端口关联的进程号&#xff0c;即PID&#xff0c;后通过PID终止该进程以释放该端口。 netstat 命令 显示协议统计信息和当前 TCP/IP网络连接,常用参数: -a: 显示所有连接和…

Packet Tracer - 配置基于区域的策略防火墙 (ZPF)

Packet Tracer - 配置基于区域的策略防火墙 (ZPF) 拓扑图 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 交换机端口 R1 G0/1 192.168.1.1 255.255.255.0 不适用 S1 F0/5 S0/0/0 (DCE) 10.1.1.1 255.255.255.252 不适用 不适用 R2 S0/0/0 10.1.1.2 255…

项目管理工具的必备功能,你需要知道这些

一个项目有很多事情需要计划、控制和管理&#xff0c;因此需要使用项目管理软件来对项目进行管理&#xff0c;除了制定计划、进度跟踪等之外&#xff0c;项目管理软件还应该有这些功能&#xff1a; 甘特图&#xff1a;帮你规划任务。比如说甘特图就可以设置多级任务、耗时和分…

AI与全民开发:挑战和机会并存

注&#xff1a;全民开发的英文是Citizen Development&#xff0c;由咨询公司Gartner在2010年提出的概念&#xff0c;指非专业开发人员使用低代码或无代码平台创建应用程序&#xff0c;无需IT部门的支持&#xff0c;旨在提高生产力并降低开发成本。 国内普遍将Citizen Developme…

dubbo服务导出源码解析

服务导出流程 需要对源码debug&#xff0c;可以参考官网的源码分析进行debug&#xff1a;https://cn.dubbo.apache.org/zh-cn/docsv2.7/dev/source/export-service/接收到 ContextRefreshedEvent 刷新事件&#xff0c;调用 ServiceBean.export()&#xff0c;会执行 ServiceCon…

刷力扣 LeetCode 算法题需要充值会员吗?

一、刷题成就 大家好&#xff0c;我是『负雪明烛』。 在过去的这些年里&#xff0c;我的一项业余爱好就是写作算法题解。如今写了上千篇题解了&#xff01; 在 CSDN 上&#xff0c;我的博客获得了 200 多万的阅读。 在力扣中国题解区&#xff0c;我也获得了180 万的阅读。…

我忽然发现周围同事都在无效内卷

想写这篇文章已经很久了&#xff0c;在三月份的时候就想写这篇文章了。 可三月份那时候需求比较多&#xff0c;每天下班时间基本都在九点多了&#xff0c;回到家就想躺着&#xff0c;压根不想写&#xff1b;四月份则是2022年度绩效评比沟通&#xff0c;一月时间又没了&#xff…

一个月内面了30家公司,薪资从18K变成28K,真行啊····

工作3年&#xff0c;换了好几份工作&#xff08;行业流行性大&#xff09;&#xff0c;每次工作都是裸辞。朋友都觉得不可思议。因为我一直对自己很有信心&#xff0c;而且特别不喜欢请假面试&#xff0c;对自己负责也对公司负责。 但是这次没想到市场环境非常不好&#xff0c;…

工作几年,面试还是说不出日志该怎么写更好?——日志规范与最佳实践篇

概览 上一篇我们讨论了为什么要使用日志框架&#xff0c;这次我们深入问题的根源&#xff0c;为什么我们需要日志&#xff1f; 大多数开发人员会纠结日志该怎么输出&#xff0c;什么时候输出&#xff0c;输出了会不会有人看等问题&#xff0c;让我们跳出开发人员的局限来考虑…

3D开发工具HOOPS最新解析合集:助力实现web端高性能模型渲染

一、3D技术为创新提供强大助力&#xff08;1&#xff09;3D专家提供专属技术支持服务 不管您想搭建桌面、WEB或者移动端APP应用&#xff0c;技术领先全球的HOOPS Platform组件都可以为您提供弹性的3D集成架构&#xff0c;同时&#xff0c;一批可信任的工业领域3D技术专家也将为…

Dubbo 基于xml文件分析主流程 (4)

目录 前提 JDK实现SPI Dubbo实现SPI Dubbo源码 1. 找到Dubbo的命名空间处理类&#xff0c;也就是Dubbo的入口类 2. 将dubbo标签交给spring进行管理&#xff0c;就是从 BeanDefinition----> Bean的过程。 3. 服务暴露 4. 服务引入 总结 仿写Dubbo 前提 1. Dubbo源码…

Information-Theoretic Segmentation by Inpainting Error Maximization总结笔记

一、《Inpainting Error Maximization》提出的提问和解决方法 《Inpainting Error Maximization》提出的提问&#xff1a;神经网络通常需要大量的手动标记的训练数据来达到最先进的性能。对于标记数据稀缺或昂贵的问题的适用性往往取决于从 相关领域迁移学习到的表示的能力。 …

在Ubuntu系统中安装JDK 17并配置环境变量

文章目录 打开终端&#xff0c;更新Ubuntu软件包列表&#xff1a;安装OpenJDK 17&#xff1a;检查JDK是否正确安装&#xff1a;配置环境变量&#xff1a; 结语 在Ubuntu系统中安装JDK 17并配置环境变量&#xff0c;可以按照以下步骤进行&#xff1a; 打开终端&#xff0c;更新U…

基于SpringBoot+Vue的宠物管理系统了解一下

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

C/C++每日一练(20230508) 相交链表、字符数组、排序链表

目录 1. 相交链表 &#x1f31f;&#x1f31f; 2. 字符数组 ※ 3. 排序链表 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 相交链表 给你两个单链表…

【Sentinel 规则持久化配置】

Sentinel 规则持久化 Sentinel 规则持久化一、修改order-service服务1.引入依赖2.配置nacos地址 二、修改sentinel-dashboard源码1. 解压2. 修改nacos依赖3. 添加nacos支持4. 修改nacos地址5. 配置nacos数据源6. 修改前端页面7. 重新编译、打包项目8.启动 Sentinel 规则持久化 …

Vulfocus-struts2初了解

CVE-2013-2135 漏洞原理&#xff1a; 配置了通配符*&#xff0c;访问name.action时使用name.jsp来渲染页面&#xff0c;但是在提取name解析时&#xff0c;对其执行了OGNL表达式解析&#xff0c;所以导致了命令执行。如果一个请求与任何其他定义的操作不匹配&#xff0c;它将匹…

注意力机制之SGE Attention

论文 Spatial Group-wise Enhance: Improving Semantic Feature Learning in Convolutional Networks 论文链接 paper:Spatial Group-wise Enhance: Improving Semantic Feature Learning in Convolutional Networks 模型结构 论文主要内容 卷积神经网络&#xff08;CNN&a…

uboot的环境变量相关源码分析

一、uboot的环境变量基础 1.1、环境变量的作用 (1)让我们可以不用修改uboot的源代码&#xff0c;而是通过修改环境变量就可以影响uboot运行时的一些特性。譬如说修改bootdelay环境变量就可以更改系统开机自动启动时倒计时的秒数。 1.2、环境变量的优先级 环境变量的优先级高…