C++深入研究Vector初始化

1,808 阅读2分钟

启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情

之前聊了聊Vector模板,实例化的概念,当中也列举了Vector的实例化方法,但是并没有深入的进行研究,那么这次我们深入的聊聊vector的实例化方法。

初始化

常规概念

还是老规矩,在展示初始化之前,先聊聊初始化用到的概念:

默认初始化

如果在定义变量的时候没有指定初值,则变量被默认初始化(default initialized),就是会给变量赋一个默认值,至于默认值到底是什么,取决于变量的类型,和变量定义的位置。具体看一下:

1、内置类型,比如int,默认如果是全局变量的话,默认初始值是0,比如char默认是空字符。

#include <iostream>int num;
char s;
​
int main(){
   using namespace std;
   cout << num << endl;
   cout << s << endl;
​
   return 0;
}

2、如果放到函数的内部,也就是说局部变量(在函数外部没有效果),那么就是不被初始化(uninitalized)的,没有初始值的变量,值是未定义的,如果视图拷贝或者其他形式的访问是会报错的。

#include <iostream>
​
using namespace std;
​
int main(){
​
   int num;
   double d;
​
   cout << num <<" " << d << endl;
   return 0;
}

访问报错。

总体上看每个类各自决定器初始化的方式,而且,是否运行不经过初始化就定义对象也由类自己决定。但是大部分的类都是支持无需显式初始化定义对象的(就是默认初始化),至于初始化的值由各个类型自己定义。

副本

副本就是copy,copy就是拷贝,复制。 副本的好处: 不影响原件,这样一份原始数据可以共享多次。 坏处: 复制需要时间和内存空间,影响性能。 而且原件发生改变的时候不会自动更新,得手动重新获取副本。

初始化常用方法

这里先展示一下常用的Vector实例化方法

方法描述
vector vec01vec01是一个空的vector,材质元素的类型是T,执行默认初始化。
vector vec02(vec01)vec02是一个包含vec01所有元素的副本。
vector vec03 = vec01等价于vec03(vec01),也是一个副本。
vector vec04(n)包含n个执行了值初始化的元素。
vector vec05(n, value)包含n个元素,每个元素的值都是value。
vector vec06{value1,value2,value3}vec06包含了{}当中的元素作为初始值。
vector vec07 = {value1,value2,value3}和上面的写法是等价的
#include <iostream>
#include <vector>using namespace std;
​
int main(){
​
   vector<int> vec01;
   vector<int> vec02 = vec01;
   vector<int> vec03(vec01);
   vector<int> vec04(4);
   vector<int> vec05(4,10);
   vector<int> vec06{10, 20, 30, 40};
   vector<int> vec07 = {10, 20, 30, 40};      
​
   return 0;
}

这里要注意几个注意的点:

1、实例化具体元素的时候是用{},而不是小括号,为啥要注意呢,我有个朋友,嗯,对他就不注意:

vector<int> vec06{10, 20, 30, 40}; //正确
vector<int> vec06(10, 20, 30, 40); //错误

2、使用{}实例化vector,需要c++11的特性,老版本是会报错的,嗯,还是我有一个朋友,嘿嘿嘿,搞了一下午,结果就是不出来。

所以需要为自己的编译器配置c++11的环境变量,具体方法大家可以找一下。

今天被测出阳性了,晕晕乎乎做了总结,还请各位大佬多多指点。