C++数组初始化详解:原生数组与 vector 的多种初始化方式

【C++基础】数组初始化 vector初始化 string初始化及基本使用方式 转载: https://www.cnblogs.com/yyzyxy/p/10336480.html 阅读详情

在刷 LeetCode 的过程中,经常会遇到各种数组初始化写法,例如:

int arr[] = {1, 2, 3};
vector<int> v(5);
vector<int> v = {1, 2, 3};

这些写法看起来非常相似,但实际含义并不完全相同。

尤其是 vector 中 () 和 {} 的区别,如果没有搞清楚,很容易出现编译错误或者初始化结果与预期不同的问题。

本文整理一下 C++ 中常见的数组初始化方式,重点介绍原生数组和 vector。


一、C++中的数组主要分为两类

在 C++ 中,我们平时说的“数组”实际上可能指两种东西:

  1. 原生数组(Built-in Array)

  2. std::vector

例如:

int arr[5];

这是 C++ 的原生数组。

而:

vector<int> v;

是 STL 中的动态数组 vector。

两者都可以用来保存一组数据,但是初始化方式和使用方式存在一些区别。


二、原生数组的初始化

1. 不指定大小,直接使用初始化列表

int arr[] = {1, 2, 3, 4};

这里没有指定数组大小。

编译器会根据初始化列表中的元素数量自动推断数组大小。

相当于:

int arr[4] = {1, 2, 3, 4};

最终:

arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4

这是原生数组非常常见的一种初始化方式。


2. 指定大小,同时初始化

int arr[4] = {1, 2, 3, 4};

这里明确指定数组大小为 4,同时提供 4 个初始值。

结果:

[1, 2, 3, 4]

3. 只初始化一部分元素

例如:

int arr[5] = {1, 2};

虽然数组有 5 个元素,但是只提供了两个初始值。

没有提供初始值的元素会被初始化为 0。

因此最终结果是:

[1, 2, 0, 0, 0]

这一点在 C++ 中非常常见。


4. 将整个数组初始化为 0

可以写:

int arr[5] = {};

结果:

[0, 0, 0, 0, 0]

这种写法非常简洁。

例如:

int count[100] = {};

可以创建一个长度为 100、所有元素初始值都是 0 的数组。


5. 创建数组后再逐个赋值

也可以先创建数组:

int arr[3];

arr[0] = 10;
arr[1] = 20;
arr[2] = 30;

最终:

[10, 20, 30]

这种方式适合需要根据程序运行过程动态计算每个元素的情况。


三、vector的初始化

在 LeetCode 等算法题中,我们更加经常使用:

vector<int>

因此,vector 的初始化方式尤其值得掌握。


1. 创建一个空 vector

vector<int> v;

此时 v 中没有任何元素:

[]

可以通过 push_back() 添加元素:

v.push_back(10);
v.push_back(20);
v.push_back(30);

最终:

[10, 20, 30]

这种方式非常适合元素数量一开始无法确定的情况。


四、vector指定元素数量

1. vector<int> v(5);

例如:

vector<int> v(5);

这里的 5 表示:

创建一个包含 5 个元素的 vector。

对于 int 类型来说,这些元素会被初始化为 0。

因此:

[0, 0, 0, 0, 0]

可以通过:

v[0] = 10;
v[1] = 20;

修改其中的元素。


2. vector<int> v(5, 10);

还可以同时指定元素数量和初始值:

vector<int> v(5, 10);

含义是:

创建 5 个元素,并且每个元素初始化为 10。

结果:

[10, 10, 10, 10, 10]

这个写法在算法题中非常常见。

例如:

vector<bool> visited(100, false);

表示创建一个包含 100 个元素的 vector,每个元素初始值都是 false。


五、使用初始化列表初始化 vector

还可以直接写:

vector<int> v = {1, 2, 3, 4};

结果:

[1, 2, 3, 4]

也可以省略 =:

vector<int> v{1, 2, 3, 4};

结果完全一样:

[1, 2, 3, 4]

这种 {} 写法叫做列表初始化(List Initialization)。


六、最容易混淆的地方:() 和 {}

这是学习 vector 初始化时最需要注意的地方。

看下面两个代码:

vector<int> v(3);

和:

vector<int> v = {3};

它们看起来很像,但含义完全不同。


vector<int> v(3);

表示:

创建 3 个元素。

结果:

[0, 0, 0]

vector<int> v = {3};

表示:

创建一个元素,这个元素的值是 3。

结果:

[3]

所以:

vector<int> v(3);

不是 [3]。

而是:

[0, 0, 0]

七、一个更加容易混淆的例子

比较:

vector<int> v(3, 5);

和:

vector<int> v{3, 5};

它们的结果完全不同。

第一种

vector<int> v(3, 5);

表示:

创建 3 个元素,每个元素都是 5。

结果:

[5, 5, 5]

第二种

vector<int> v{3, 5};

表示:

使用 3 和 5 两个元素进行初始化。

结果:

[3, 5]

所以一定要注意:

v(3, 5)

和:

v{3, 5}

不是一回事。


八、一次实际的 LeetCode 报错

在刷 LeetCode 的时候,我遇到过这样的代码:

vector<double> ans(2) = {
    celsius + 273.15,
    celsius * 1.8 + 32.0
};

编译器报错:

error: expected ';' at end of declaration

乍一看很容易以为是分号的问题。

实际上,真正的问题是:

vector<double> ans(2) = {...};

这种声明方式本身就是非法的 C++ 语法。

不能把:

vector<double> ans(2);

和:

vector<double> ans = {a, b};

这两种初始化方式直接拼在一起。


九、正确写法一:使用初始化列表

如果希望直接创建:

[a, b]

应该写:

vector<double> ans = {
    a,
    b
};

例如温度转换:

vector<double> convertTemperature(double celsius) {
    vector<double> ans = {
        celsius + 273.15,
        celsius * 1.8 + 32.0
    };

    return ans;
}

十、正确写法二:先创建,再通过下标赋值

也可以写成:

vector<double> convertTemperature(double celsius) {
    vector<double> ans(2);

    ans[0] = celsius + 273.15;
    ans[1] = celsius * 1.8 + 32.0;

    return ans;
}

这里:

vector<double> ans(2);

先创建两个元素:

[0, 0]

然后:

ans[0] = ...
ans[1] = ...

逐个修改。

这种写法对于刚开始学习 C++ 的人来说非常直观。


十一、正确写法三:直接返回初始化列表

如果代码比较熟练,还可以直接:

vector<double> convertTemperature(double celsius) {
    return {
        celsius + 273.15,
        celsius * 1.8 + 32.0
    };
}

因为函数的返回类型已经明确是:

vector<double>

所以 C++ 可以根据返回类型构造对应的 vector。


十二、size 和 capacity 不要混淆

还有一个容易出现的概念错误。

例如:

vector<int> v(5);

这里的 5 表示的是:

size,也就是当前元素数量。

因此:

v.size()

结果是:

5

而 capacity() 表示 vector 当前已经分配的存储空间能够容纳多少元素。

例如:

v.capacity()

可能得到:

5

也可能得到一个大于 5 的值。

因此:

size     → 当前有多少个元素
capacity → 当前分配的空间最多可以容纳多少元素

两者不是一个概念。


十三、常见初始化方式总结

可以把最常用的写法总结成下面这张表:

写法含义示例结果
vector<int> v;创建空 vector[]
vector<int> v(5);创建 5 个元素[0,0,0,0,0]
vector<int> v(5, 10);创建 5 个元素,每个为 10[10,10,10,10,10]
vector<int> v = {1,2,3};使用元素初始化[1,2,3]
vector<int> v{1,2,3};使用列表初始化[1,2,3]
vector<int> v(3); 后 v[i]=...先创建再赋值根据赋值结果
vector<int> v; 后 push_back()动态添加元素根据添加结果

十四、刷 LeetCode 时怎么选择?

对于算法题,我建议优先掌握这几种。

需要固定数量、默认值为 0:

vector<int> nums(100);

需要固定数量,并设置统一初始值:

vector<int> nums(100, -1);

已经知道具体有哪些元素:

vector<int> nums = {1, 2, 3, 4};

元素数量不确定:

vector<int> nums;

nums.push_back(1);
nums.push_back(2);

返回几个计算结果:

return {a, b};

十五、最后记住这几个区别

如果只记几个最重要的知识点,可以记下面这些:

vector<int> v(3);

表示:

创建 3 个元素

而:

vector<int> v{3};

表示:

创建 1 个元素,值为 3

再看:

vector<int> v(3, 5);

表示:

创建 3 个元素,每个值为 5

而:

vector<int> v{3, 5};

表示:

创建 2 个元素,分别为 3 和 5

最后,不要写:

vector<int> v(3) = {1, 2, 3};  // ❌

应该根据需求选择:

vector<int> v(3);

或者:

vector<int> v = {1, 2, 3};

总结

C++ 中数组初始化的写法比较多,但在实际刷题过程中,并不需要一开始全部记住。

对于 vector,最重要的是理解:

() → 经常用于指定元素数量/统一初始值

{} → 经常用于直接使用一组具体元素进行初始化

例如:

vector<int> a(5);        // 5 个元素
vector<int> b(5, 1);     // 5 个 1
vector<int> c{1, 2, 3};  // 3 个具体元素

把这三个区别真正理解之后,LeetCode 中绝大多数 vector 初始化代码就不会再容易混淆了。

c++vector对象初始化 C++vector对象初始化因为最近在准备C++,用到了vector STL,但是发现自己完全不太会用,所以上网查了一下一些常用的初始化方法(其实就是把vector当做一个安全的动态数组即可),其他使用方法基本类似于C的数组,主要是初始化有些多元化,这里详细列举一下。下面代码用到的两个iter量声明 vector<int>::iterator int_ite; vector<string>::it 阅读详情

相关推荐

CHB-MIT波士顿儿童医院癫痫EEG脑电数据处理(一)

CHB-MIT癫痫EEG脑电数据处理CHB-MIT头皮脑电图数据介绍CHB-MIT头皮脑电图数据下载CHB-MIT头皮脑电图数据处理提取原始数据滤波(0.1~50hz)数据分块(时间窗口) CHB-MIT头皮脑电图数据介绍 该数据库收集自波士顿儿童医院,其中包括患有难治性癫痫发作的儿科患者的脑电图记录。停用抗癫痫药物后最多持续几天对受试者进行监测,以表征其癫痫发作并评估其对手术干预的候选资格。 从22位受试者中收集了23个病例的记录(5例男性,3至22岁; 17例女性,1.5至19岁)。 (案例chb21是

AI_DOG的博客 1万+

​C++ vector 初始化方式详解

​vector是 C++ STL 中最常用的动态数组容器,支持多种初始化方式。本文将详细介绍vector的初始化方法,并整理成博客形式,方便查阅。

weixin_72058778的博客 1670

大样本EEG公共数据集汇总

描述: OpenNeuro平台包含多个认知障碍相关的EEG数据集,例如针对轻度认知障碍(MCI)或阿尔茨海默病(AD)的研究。描述: 天普大学医院EEG语料库包含大量临床EEG记录,可通过元数据筛选出与认知障碍相关的片段(如诊断标签包含dementia或MCI)。描述: ADNI主要提供多模态神经影像数据(MRI/PET),但部分合作研究整合了EEG数据。样本量: 部分数据集包含100+被试(例如结合MRI与EEG的多模态数据)。样本量:30,000+ EEG记录(持续更新,全球最大临床EEG数据库)。

谁人打的太极拳的博客 1760

【C++】vector 不踩坑指南:用法、底层实现与迭代器失效解析

本文详细介绍了C++中vector容器的使用方法,包括定义初始化、常用成员函数、手搓实现及迭代器失效问题。主要内容包括:1. vector的三种初始化方式及打印方法;2. 容量相关(size/resize/capacity等)、元素操作(push_back/insert/erase等)、访问([]/at/front等)常用函数;3. 通过模拟实现vector展示底层原理;4. 重点解析迭代器失效问题,给出安全删除元素的方法,强调erase后必须使用返回值更新迭代器。文章通过大量代码示例演示vector的典型

小年糕的博客 1475

深入解析线性反馈移位寄存器(LFSR)的工作原理与实现

本文深入解析了线性反馈移位寄存器(LFSR)的核心原理与实现方法。通过生动的比喻和详细的步骤拆解,阐述了LFSR如何通过反馈多项式和移位操作生成伪随机序列,并对比了斐波那契型与伽罗瓦型两种硬件结构。文章还涵盖了LFSR在数字电路测试、通信扰码及快速伪随机数生成等关键应用场景,同时指出了其在密码学中的局限性,并提供了Python和C语言的高效实现代码示例。

weixin_29007243的博客 545

告别regsvr32!易语言调用大漠插件dm.dll的免注册实战(附Win7/10/11避坑指南)

本文详细介绍了易语言如何免注册调用大漠插件dm.dll的实战方法,通过`dmreg.dll`实现真正的免注册调用,规避了传统`regsvr32`注册方式带来的权限和兼容性问题。文章包含核心原理剖析、易语言实现细节、多系统兼容性方案及高级应用场景,帮助开发者实现绿色化部署,提升自动化脚本开发效率。

weixin_42553471的博客 303

vector的初始化(5种不同方式)

逐个push_back // CPP program to create an empty vector // and push values one by one. #include <iostream> #include <vector> using namespace std; int main() { // Create an empty vector ...

layman to computer science 1万+

SPSS实战:5步搞定多指标联合诊断的ROC曲线分析(附Logistic回归教程)

本文详细介绍了如何使用SPSS软件进行多指标联合诊断的ROC曲线分析。通过5个实战步骤,从数据准备、二元Logistic回归建模生成综合预测概率,到绘制并比较单指标与联合模型的ROC曲线,帮助临床研究者有效整合多个诊断指标,提升模型判别能力(AUC),实现诊断效能的优化。

mqtt6iot的博客 1422

vector的几种初始化及赋值方式

C++的初始化方法很多,各种初始化方法有一些不同。 (1): vector ilist1; 默认初始化,vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间。这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况。 (2): vector ilist2(ilist); vector ilist2 = ilist; 两种方式等价 ,ilist2 初始化为ilist 的拷贝,ilist必须与ilist2 类型相同,也就是同为int的vect

肥嘟嘟的左卫门 5125

rk3568 修改开机动画

bootanimation.zip是一个Android设备启动时播放的动画文件,它包含了一系列的图片和描述文件,用于描述动画的播放顺序和持续时间。

weixin_35723192的博客 2728

国科大学习资料--遥感原理集图像处理(尤红建)--2019年期末考试

国科大学习资料–遥感原理集图像处理(尤红建)–2019年期末考试 国科大学习资料–遥感原理集图像处理(尤红建)–2019年期末考试 国科大学习资料–遥感原理集图像处理(尤红建)–2019年期末考试 ================================================================== ================================================================== ==============

无名何许人的博客 1469

C++ vector的初始化

C++ vector的初始化一维数组的初始化1. vector &lt; int &gt; v;2. vector &lt; int &gt; v = {1,2,3,4,5};3. vector &lt; int &gt; v(n); vector &lt; int &gt; v(n,m);4. vector &lt; int &gt; v(v0);5. vector &lt; int &gt;...

qq_40147449的博客 18万+

set_input_delay/set_output_delay介绍

针对这一类的情况,在做block时,cts之后,便需要将update_io_latency给关闭。那么,计算的timing就是错误的了。对于hier flow来讲,切分block,进行timing budget的时候,clock tree还未长。计算block端口上的timing,通常需要用到set_input_delay和set_output_delay告知工具外部电路的延迟信息,以方便工具计算端口上的timing。此时,工具在计算in2reg的timing时,便会将2.67ns的delay带进来。

芯冰乐 319

C++ vector常用的初始化方式

使用另外一个数组的指针来初始化v,这里即可以使用vector的指针,也可以使用普通数组的指针。这里可以使用 v.resize(n),或者v.resize(n, m) 来初始化。与一维数组一样,这时候v的size为0,如果直接访问会报错。:这时候v的size为0,如果直接访问 v[i] 会报错。前者是使用n个0来初始化,后者是使用n个m来初始化。使用另一个数组来初始化,v0也必须是vector。初始化一个n*m,值全为1的二维数组。初始化为n个0的一维数组。初始化为n个m的一维数组。

m0_53911267的博客 3846

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++ vector数组初始化大小的方法

** 一、定义一个一维vector数组v1,数组大小为n,初始值为0** 初试化数组长度 const int m = 100; vector<int> v1(m); //size = 100 初始化数组大小和值 vector<int> v1(m, 0); //size = 100; every item = 0 拷贝vector数组 vector&lt...

weixin_44718636的博客 3万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【编程语言】C++ 中 vector 初始化的多种方法详解

C++ 中 vector 初始化的多种方法详解

XuanRan的博客 8671

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++ Vector数组初始化(一维,二维)

Vector数组快速声明与初始化 一维 以int类型为例子 设置数组长度的默认初始vector<int> data(N); N为默认数组长度,默认初始值为0 设置数组长度的给定值初始vector<int> data(N,value); N为默认数组长度value为初始值 直接给定数据vector<int> data = {1,2,3,4,5}; 动态改...

编程小生的专栏 2万+

c++基础之vector、数组初始化

默认定义了一个size为5初始值全为0的vector 定义了size为5的初始值全为1的vector v2 如果要指定vector中的每个值,可以通过先定义一个数组,把数组首地址和要传的最后一个元素的下一个地址传进去,比如 可以看到将a的起始元素开始到第四个元素之前的元素都给了v3 下面来看看二维vector初始化 可以看到vv初始化为5个size为0的vecto...

qq_38665104的博客 2万+

C++动态数组:std::vector一维与二维的初始化和操作指南

本文将介绍如何初始化一维和二维的 std::vector 数组,并展示一些常见的动态数组插入与删除等操作方法。

m0_59246703的博客 1809

C++之Vector详解|即学即会

C++之Vector详解|即学即会前言一、为什么要用Vector?二、Vector的优缺点 优点 缺点三、Vector的声明四、Vector的常用方法2.读入数据总结 前言 vector是C++标准模板库中的部分内容,通常我们喊做“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。 提示:以下是本篇文章正文内容,下面案例

u014627020的博客 5125

cpp-数组初始化

title: cpp-数组初始化 date: 2020/6/29 11:35:57 categories: C++ tags: 数组 初始化 在C++中,普通数组是固定长度的,标准库类型vector可理解为可扩充数组(即长度不固定)。 编译参数:g++ --std=c++2a vector数组的初始化 初始化vector对象的方法 方法说明 vector v1 v1是一个空vector,它潜在的元素是T类型的,执行默认初始化 vector v2(v1) v2中包含v1所有元素的.

windows is yes 2389

c++ 用数组初始化vector

数组之间不能相互初始化; 不能用vector对象初始化数组; 但是: 可以用数组初始化vector对象; #include<iostream> #include<vector> using namespace std; void main() { char a[4] = { 'a','b','c','d' }; vector<char> vec(begin(...

ms_cplusplus的博客 1882

C++ Primer:string、vector和数组初始化总结

1. string初始化 #include <iostream> #include <string> using namespace std; // 函数外部默认初始化 string s1_0; int i1_0; int main() { // 函数内部默认初始化 string s1_1; // string是类,类各自绝对决定初始化方式,如strin...

北冥有鱼wyh的博客 3563

c++ vector二维数组初始化与vector切片

实际开发过程中,经常会使用vector嵌套的方式来模拟二维数组,下面我们详细分析一下如何对其进行初始化。同时array是动态数组,后面可以通过resize方法将其列数指定为2。我们还可以在创建vector的时候,直接指定vector的行数与列数。首先我们采用逐个初始化的方式,对二维vector进行初始化。上面的array,是3行2列的二维数组,默认初始值为0。注意实际使用的时候,B要及时进行clear操作。上面的run方法运行以后,得到的结果如下。上面我们首先指定array的行数为3。......

bitcarmanlee的博客 5566

c++中的数组与vector

本文转自c++中数组与vector 一、数组 C++中数组是一种内置的数据类型。 数组是存放类型相同的对象的容器,数组的大小确定不变,不能随意向数组中增加元素。 1、定义与初始化 (1)数组的大小不变,(a[d],d为数组的维度),数组的维度必须是一个常量表达式。定义数组的时,必须指定数组的类型和大小。 (2)初始化时,允许不指明数组的维度,不指明维度,则编译器根据数组初始值的大小推测出维度;若指定维度,则初始值的个数要小于等于维度,当小于时,不足的部分为0(其实还是等于维度)。 1 int a[]={1,

ShineSmile29的博客 2467
上一篇: C++ Qt项目如何上传到GitHub:以RadarSimulator为例,从Git初始化到Push完整实战
下一篇: C++ for循环中声明不同类型变量为什么会报错?
Junfeng_Li
博客等级 码龄10年 7粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Junfeng_Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值