(六十一)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;

会在运行时提示出错

时间: 2024-09-28 13:10:29

(六十一)vector、array和数组的相关文章

c++-关于C++ vector中存放数组,出现问题

问题描述 关于C++ vector中存放数组,出现问题 我想定义一个vector,里面放几个数组,每个数组长度为2,数组的值由控制台输入. 先定义两个整数M,N,N表示vector中数组的数目,M是另外一个整数,答主可以不必关心. 当M=N=-1时跳出循环.整数J,F是存储在数组中的值,也由控制台输入. 然后对vector排序,排序规则定义在cmp函数中,按照J/F的值由大到小排序. 比如:对于{[7,2],[4,3],[5,2]},排序后为{[7,2],[5,2],[4,3]} 代码如下: #

[LeetCode] Find the Derangement of An Array 找数组的错排

In combinatorial mathematics, a derangement is a permutation of the elements of a set, such that no element appears in its original position. There's originally an array consisting of n integers from 1 to n in ascending order, you need to find the nu

Java集合学习(六) Vector详细介绍(源码解析)和使用示例

学完ArrayList和LinkedList之后,我们接着学习Vector.学习方式还是和之前一样,先对Vector有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. 第1部分 Vector介绍 Vector简介 Vector 是矢量队列,它是JDK1.0版本添加的类.继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口. Vector 继承了AbstractList,实现了List:所以,它是一个队列,支持相关的添加.删除.修改.

六十一、NT网的无盘工作站远程登陆_网络冲浪

六十一.NT网的无盘工作站远程登陆     远程启动服务是 Windows NT Server 的一项功能,它支持远程工作站使用服务器硬盘上的软件启动 MS-DOS 和 Windows.使用远程启动服务可以增加网络安全性,并提供给网络系统管理员更大的控制权, 具有容易集中升级软件,降低购买和维护工作站的成本等优点.目前,在NT网络资料中还没有涉及到模板配置文件中不存在的一般网卡的远程启动配置资料,大家都很关心如何解决它的配置问题.    下面作者以中文NT Server 4.0 为例, 介绍NT

array multisort:数组 php array

$money = array (0 =>array ( 'money' => '21', 'time' => '2012-10-18', ),1 =>array ( 'money' => '28', 'time' => '2012-10-17', ),2 =>array ( 'money' => '92', 'time' => '2012-10-16', ),3 =>array ( 'money' => '428', 'time' =>

php数组函数库array建立数组

函数|数组 1.新建数组使用array array array ( [mixed ...] )   返回根据参数建立的数组.参数可以用 => 运算符给出索引.关于数组是什么的信息请阅读数组一节. 注: array() 是一个语言结构,用于字面上表示数组,不是常规的函数. 语法"index => values",用逗号分开,定义了索引和值.索引可以是字符串或数字.如果省略了索引,会自动产生从 0 开始的整数索引.如果索引是整数,则下一个产生的索引将是目前最大的整数索引 + 1

剑指offer系列之三十六:数字在排序数组中出现的次数

题目描述 统计一个数字在排序数组中出现的次数. 因为是排序数组,自然联想到二分查找算法,这样我们在二分的时候可能会获取多个相同的数字.就是说,中间那个位置的值可能刚好是统计的那个值,假设为k.那么k还有可能在前面或者后面出现,在这个基础上继续二分当然也是可以的,如果能够在使用二分查找算法的时候统计出第一个k和最后一个k出现的位置,那么k出现的次数自然就确定了.第一个k出现的位置,可以使用二分查找算法,如果中间位置的值刚好是k,那么继续比较中间位置前面位置的值是不是也是k,如果不是那么该中间位置就

Javascript array类 数组操作方法_javascript技巧

push 方法 将新元素添加到一个数组中,并返回数组的新长度值. arrayObj.push([item1 [item2 [. . . [itemN ]]]]) 参数 arrayObj 必选项.一个 Array 对象. item, item2,. . . itemN 可选项.该 Array 的新元素. 说明 push 方法将以新元素出现的顺序添加这些元素.如果参数之一为数组,那么该数组将作为单个元素添加到数组中.如果要合并两个或多个数组中的元素,请使用 concat 方法. 示例 [Ctrl+A

javascript Array.remove() 数组删除_javascript技巧

复制代码 代码如下: Array.prototype.remove = function(b) { var a = this.indexOf(b); if (a >= 0) { this.splice(a, 1); return true; } return false; }; 以后使用过程中,就可以直接利用这个函数,删除数组中的值了.