(六十一)vector、array和数组

简介:

模板类vector:

模板类vector类似string类,是一种动态数组。

 

比如说,string类可以将一个string的字符串插入到另外一个string类字符串后面。vector也可以有类似的功能。

 

而对于vector类来说,他是一个数组,比如我们数组中有第一个A和第二个元素B,然后我们可以把C插入在A和B之间,这个时候,数组第一个成员为A,第二个为C,第三个为B。

 

我们还可以把其中一个成员删掉,这样,后面两个成员自动向前进一位,比如删掉第一个成员A,于是第一个成员变成了C,第二个成员变成了B。

 

 

头文件:

#include<vector>//使用vector类需要引用头文件vector

 

创建vector类数组:

vector<类型名>数组名(成员个数);

比如:

vector<double>vd(n);

注意:成员个数可以为变量,这样在使用的时候更自由。

 

给vector数组成员赋值:

可以像使用普通数组一样,使用 变量名[编号] 来进行赋值,注意:第一个成员的编号为0,和数组是一样的。例如:

vd[1] = 22;

数组vd的第二个成员的值为22。

注意:vector类在声明并初始化的时候。分三种情况:

①声明成员个数,不赋值;

②声明成员个数,赋相同的值;

③不声明成员个数,赋不同的值,赋值几个成员就是有几个成员。

如代码:

 

#include<iostream>
#include<vector>

int main()
{

	using namespace std;
	vector<double>aaa(3);	//原型:vector<类型名>数组名(数组成员数);
	cout << "原型数组aaa.size() = " << aaa.size() << endl;

	vector<int>a(3, 4);	//变型1(声明并初始化多个数值一样的成员):vector<类型名>变量名(成员个数,值且同时给每个成员都赋值);
	cout << "变型1,数组a,初始化时同时给多个数组成员赋 相同值\n";
	cout << "a[0] = "<< a[0] << endl;	//输出数组a第一个成员
	cout << "a[1] = " << a[1] << endl;	//输出数组a第二个成员
	cout << "a[2] = " << a[2] << endl;	//输出数组a第三个成员
	cout << "数组a.size() = " << a.size() << endl;	//显示数组a的成员数

	vector<int>b = { 1,2,3,4 };	//变型2(声明并初始化数组成员):vector<类型名>数组名{成员1的值,成员2的值,……};
	//注意,给不同成员赋 不同的值 是用大括号,不写成员个数。
	//给不同成员赋 相同的值 是写在小括号里,写在成员个数之后
	cout << "变型2,数组b,初始化并给数组成员赋不同的值,需要c++11\n";
	cout << "b[0] = " << b[0] << endl;
	cout << "b[1] = " << b[1] << endl;
	cout << "b[2] = " << b[2] << endl;
	cout << "b[3] = " << b[3] << endl;
	cout << "b.size() = " << b.size() << endl;

	vector<int>c{ 8,9 };	//变型3(和变型2相同,只不过省略了等号):vector<类型名>数组名{成员1,成员2……};
	cout << "变型3,数组c,初始化时赋不同的值,需要C++11\n";
	cout << "c[0] = " << c[0] << endl;
	cout << "c[1] = " << c[1] << endl;

	//vector<int>d(3) = { 1, 3,5 };
	//注:这种想在初始化时,确定成员个数比如3个,然后给第一个和第二个成员赋值的方式是不可行的。
	//即使同时给3个成员都赋值,也是不可行的。
	//要么是不写成员个数,给成员赋不同的值(赋值几个成员就是有几个成员);
	//要么是写成员个数,给成员赋相同的值;
	//要么是写成员个数,不给成员赋值;

	system("Pause");
	return 0;
}


输出:


原型数组aaa.size() = 3
变型1,数组a,初始化时同时给多个数组成员赋 相同值
a[0] = 4
a[1] = 4
a[2] = 4
数组a.size() = 3
变型2,数组b,初始化并给数组成员赋不同的值,需要c++11
b[0] = 1
b[1] = 2
b[2] = 3
b[3] = 4
b.size() = 4
变型3,数组c,初始化时赋不同的值,需要C++11
c[0] = 8
c[1] = 9
请按任意键继续. . .



在vector类的数组中插入一个成员:

使用命令 数组名.insert(数组名.begin()+插入位置,插入的成员);

例如,给vd数组的第二个位置插入一个成员,成员的值为a(a可以是变量名,也可以是常量,但需要已经初始化)。如代码:

vd.insert(vd.begin()+1, a);

注意:插入到第二个位置,是+1,而原来数组第二个位置的成员,将依次向后退一位,比如原来第二个位置的成员,在插入后就在第三个位置了。

 

删除vector类数组中的一个成员:

使用命令 数组名.erase(数组名.begin()+删除位置):

比如,删除vd数组第一个成员,那么删除位置就应该写0。注意,数组第一个位置的编号是0。如代码:

vd.erase(vd.begin() + 0);

 

在vector类数组的尾部插入一个成员:

即在数组的最后插入一个成员,这个成员的插入,增加了数组成员的个数。代码为:  数组名.push_back(数组成员);

例如在数组最后加入成员10,代码:

vd.push_back(10);

 

vector类数组的成员数:

数组成员数是可以变的,用 数组名.size() 可以显示成员的数量。——按照某个帖子的说法是 向量大小 。

①在创建并声明时,成员数为声明时的成员数,即使某个成员并没有被赋值,也会被算入在内。

②在插入成员,无论是在中间插入或者是在尾部插入,都会增加成员数。

③在删除成员时,也会相应减少成员数。

代码是:

cout << "vd数组的宽度为:" << vd.size() << endl << endl;//显示数组的成员数


 

将一个vector数组赋值给另外一个vector数组:

当两个数组类型相同,(元素数无需相同),可以进行赋值。

格式为:目标数组名=源数组名;

 

 

上代码:

#include<iostream>
#include<vector>	//使用vector类需要引用头文件vector

int main()
{
	using namespace std;
	int n;	//声明变量n
	cout << "输入vector类的数组元素个数(请大于等于3):" << endl;
	cin >> n;	//要求用户输入变量n
	vector<double>vd(n);	//创建一个double类型的vector动态数组,数组元素为n个,数组名为vd
							//即 vector<类型名>数组名(成员数量),注意,成员数量可以为变量
	cout << "输入vd[0]:";
	cin >> vd[0];	//调用的时候,用vector类的数组名加元素编号,第一个元素编号为0,同数组。要求用户输入vd[0]的值
	cout << "将vd[1]赋值22。" << endl;
	vd[1] = 22;	//给vd[1],即数组中第2个成员,赋值22
	cout << "vd[0]为" << vd[0] << "。vd[1]为" << vd[1] << endl;
	cout << "vd数组的宽度为:" << vd.size() << endl << endl;	//显示数组的成员数

	int a = 1;
	vd.insert(vd.begin() + 1, a);	//在数组中第二个位置插入变量a
	cout << "现在,创建常量a=1,然后将a插入在vd[1]之前,即把a插入到vd[1]的位置,原来的vd[1]依次顺延到下一位。" << endl;
	cout << "vd[0]为" << vd[0] << "。vd[1]为" << vd[1];
	cout << "vd[2]为:" << vd[2] << endl;	//原本第二个位置的成员被顺延到第三个位置了
	cout << "vd数组的宽度为:" << vd.size() << endl << endl;	//显示数组的成员数

	vd.erase(vd.begin() + 0);	//删除数组中第一个成员,其他成员依次向前进一位
	cout << "现在,删除vd[0]当前成员,原来的vd[1]就变成vd[0]了。" << endl;
	cout << "vd[0]为" << vd[0] << "。vd[1]为" << vd[1] << endl;
	cout << "vd数组的宽度为:" << vd.size() << endl << endl;	//显示数组的成员数

														//n = 5;	//虽然上面vd[n]声明了数组的成员数,但单纯更改变量n,其实是不能改变vd数组的成员个数的。
	int b = 2, c = 3, d = 4;	//声明新的变量bcd并初始化
	vd.insert(vd.begin() + 2, b);	//在第三个位置插入成员b
	vd.insert(vd.begin() + 3, c);	//在第四个位置插入成员c
	vd.insert(vd.begin() + 4, d);	//在第五个位置插入成员d
	cout << "从第三个位置依次插入b=2,c=3,d=4" << endl;
	cout << "目前,vd[0]为" << vd[0] << "。vd[1]为" << vd[1] << "。vd[2]为" << vd[2] << "。vd[3]为" << vd[3] << "。vd[4]为" << vd[4] << endl;
	cout << "vd数组的宽度为:" << vd.size() << endl << endl;	//显示数组的成员数

														//vd.erase(vd.begin() + 1, vd.end() + 2);	
														//按照说法,这行代码可以删除多个数组成员,但实际测试中却出错了。

	vd.push_back(10);	//在数组的最后插入成员,值为10
	cout << "在vd数组的尾部插入常量10。" << endl;
	cout << "第" << n + 4 << "个元素是数组的最后一个元素,vd[" << n + 3 << "]的值为:" << vd[n + 3] << endl;	//注意,这行是可以通过变量来显示相应的数组的成员的,比如vd[n+3]是数组第n+4个成员
	cout << "vd数组的宽度为:" << vd.size() << endl << endl;	//显示数组的成员数

	vector<double>bb(20);	//创建vector类数组bb,因为要将vd数组赋值给bb数组,因此成员数不重要
	bb = vd;	//将vd数组赋值给bb数组,二者将完全等同
	cout << "将vd数组赋值给bb数组\n";
	cout << "bb数组第四个成员bb[3]=" << bb[3] << endl;
	cout << "bb数组的成员数为:" << bb.size() << endl;

	system("pause");
	return 0;
}

输出:


输入vector类的数组元素个数(请大于等于3):
33
输入vd[0]:55
将vd[1]赋值22。
vd[0]为55。vd[1]为22
vd数组的宽度为:33

现在,创建常量a=1,然后将a插入在vd[1]之前,即把a插入到vd[1]的位置,原来的vd[1]依
次顺延到下一位。
vd[0]为55。vd[1]为1vd[2]为:22
vd数组的宽度为:34

现在,删除vd[0]当前成员,原来的vd[1]就变成vd[0]了。
vd[0]为1。vd[1]为22
vd数组的宽度为:33

从第三个位置依次插入b=2,c=3,d=4
目前,vd[0]为1。vd[1]为22。vd[2]为2。vd[3]为3。vd[4]为4
vd数组的宽度为:36

在vd数组的尾部插入常量10。
第37个元素是数组的最后一个元素,vd[36]的值为:10
vd数组的宽度为:37

将vd数组赋值给bb数组
bb数组第四个成员bb[3]=3
bb数组的成员数为:37
请按任意键继续. . .


模板类array(限C++11):

vector类比数组强大,但是代价是效率较低(不知道为什么,因为使用的是动态存储区么?),如果是长度固定的数组(因为vector是动态数组,可以增加成员或者减少成员),使用数组更高,但代价是不那么安全和方便(不方便我知道,但是不安全是为什么?)。

因此,c++11增加了模板类array,使用的是栈(静态存储区)(vector是堆,动态存储区),位于名称空间std之中。

因此array效率和数组相同,但是更安全和方便,要创建array对象,需要包含头文件array。array对象的创建和语法与vector稍有不同。

 

头文件:

#include <array>//使用模板array需要调用头文件array


声明和创建:

声明一个array类数组和vector数组方式不同,格式为: array<类型名,成员数常量>数组名;

例如创建一个int类型,成员数为3,数组名为a的array类的代码为:

array<int, 3> a;

注意:①vector的成员数是可变的,而array的成员数是固定的。

②vector和array都是<>括号,而不是小括号()。

 

初始化和赋值:

因为和数组类似,所以初始化和赋值的方式类似数组。

初始化的格式为: array<类型名,成员数>数组名={成员1,成员2,……};

赋值格式为: 数组名[编号]=常量;

例如,初始化数组a的前2个成员的代码为:

array<int, 3> a = { 1,2 };

给a的第三个成员赋值的代码为:

a[2] = 4;


 

显示成员数:

与vector类相同,显示成员数的代码为: 数组名.size()

例如代码:

cout << a.size() << endl;

 

 

上代码:

<pre name="code" class="cpp">#include<iostream>
#include<array>	//使用模板array需要调用头文件array

int main()
{
	using namespace std;
	array<int, 5> a = { 1,2 };	//创建array类数组a,成员数为5,类型为int类,并为前2个成员赋值
	a[2] = 4;	//为第三个成员赋值
	cout << a[0] << endl;	//显示第一个成员的值
	cout << "请为数组第四个成员赋值:" << endl;
	cin >> a[3];	//读取用户输入,为第四个成员赋值
	cout << "第四个成员的值为" << a[3] << endl;		//显示第四个成员的值
	cout << "数组的成员数为:" << a.size() << endl;	//显示成员数
	
	array<int, 5 >b;	//创建数组b
	b = a;	//由于数组和数组a的类型相同,成员数相同,故可以将数组a赋值给数组b
	cout << "array类数组b等于数组a,b的第二个元素为b[1]=" << b[1] << endl;	//显示数组b第2个元素,和数组a第二个元素相同

	system("pause");
	return 0;
}


 

输出:


1
请为数组第四个成员赋值:
55
第四个成员的值为55
数组的成员数为:5
array类数组b等于数组a,b的第二个元素为b[1]=2
请按任意键继续. . .

vector对象、array对象和普通数组之间的相同和差异:

普通数组

vector类

array类

备注

表示数组成员

数组名[编号]

数组名[编号]

数组名[编号]

第一个成员编号为0,后面一次类推

将一个数组赋值给另外一个数组

不可

可,需类型数相同

可,类型和成员数需相同

 

显示成员数

size(数组名)

数组名.size()

数组名.size()

 

头文件

无需

vector

array

 

名称空间

无需

std

std

 

声明时,进行初始化赋值

可,但不同于其他两类。具体见前文。

 

数组成员数变更

不可

不可

 

在数组成员之间插入新成员

不可

不可

 

删除现有数组成员

不可

不可

 

使用内存空间

使用栈(静态内存分配)

使用堆(自由存储空间)

使用栈(静态内存分配)

 

初始化成员数

常量

常量或者变量

常量

 

能否访问数组范围外的数据

例如数组名[-40]或者数组名[100]

能否使用 数组名.at(编号)检查是否在数组的范围外

不可

例如array<int, 4>a= { 1,2,3,4 };

cout << a.at(-1) << endl;

会在运行时提示出错



目录
相关文章
|
6月前
|
Python
使用array()函数创建数组
使用array()函数创建数组。
132 3
|
1月前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
|
1月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
|
1月前
|
存储 JavaScript 前端开发
JavaScript Array(数组) 对象
JavaScript Array(数组) 对象
27 3
|
1月前
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
|
2月前
|
Go
Golang语言之数组(array)快速入门篇
这篇文章是关于Go语言中数组的详细教程,包括数组的定义、遍历、注意事项、多维数组的使用以及相关练习题。
35 5
|
3月前
|
Python
PyCharm View as Array 查看数组
PyCharm View as Array 查看数组
86 1
|
4月前
|
索引
|
5月前
|
存储 安全 算法
C++的内置数组和STL array、STL vector
C++的内置数组和STL array、STL vector
|
4月前
|
JavaScript API 索引
JS【详解】Set 集合 (含 Set 集合和 Array 数组的区别,Set 的 API,Set 与 Array 的性能对比,Set 的应用场景)
JS【详解】Set 集合 (含 Set 集合和 Array 数组的区别,Set 的 API,Set 与 Array 的性能对比,Set 的应用场景)
69 0

热门文章

最新文章

下一篇
无影云桌面