(六十一)vector、array和数组
来源:互联网 发布:h3c添加端口到vlan 编辑:程序博客网 时间:2024/06/06 01:39
模板类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] = 4a[1] = 4a[2] = 4数组a.size() = 3变型2,数组b,初始化并给数组成员赋不同的值,需要c++11b[0] = 1b[1] = 2b[2] = 3b[3] = 4b.size() = 4变型3,数组c,初始化时赋不同的值,需要C++11c[0] = 8c[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类需要引用头文件vectorint main(){using namespace std;int n;//声明变量ncout << "输入vector类的数组元素个数(请大于等于3):" << endl;cin >> n;//要求用户输入变量nvector<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个成员,赋值22cout << "vd[0]为" << vd[0] << "。vd[1]为" << vd[1] << endl;cout << "vd数组的宽度为:" << vd.size() << endl << endl;//显示数组的成员数int a = 1;vd.insert(vd.begin() + 1, a);//在数组中第二个位置插入变量acout << "现在,创建常量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);//在第三个位置插入成员bvd.insert(vd.begin() + 3, c);//在第四个位置插入成员cvd.insert(vd.begin() + 4, d);//在第五个位置插入成员dcout << "从第三个位置依次插入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);//在数组的最后插入成员,值为10cout << "在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]为22vd数组的宽度为:33现在,创建常量a=1,然后将a插入在vd[1]之前,即把a插入到vd[1]的位置,原来的vd[1]依次顺延到下一位。vd[0]为55。vd[1]为1vd[2]为:22vd数组的宽度为:34现在,删除vd[0]当前成员,原来的vd[1]就变成vd[0]了。vd[0]为1。vd[1]为22vd数组的宽度为:33从第三个位置依次插入b=2,c=3,d=4目前,vd[0]为1。vd[1]为22。vd[2]为2。vd[3]为3。vd[4]为4vd数组的宽度为:36在vd数组的尾部插入常量10。第37个元素是数组的最后一个元素,vd[36]的值为:10vd数组的宽度为:37将vd数组赋值给bb数组bb数组第四个成员bb[3]=3bb数组的成员数为: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需要调用头文件arrayint 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;//创建数组bb = a;//由于数组和数组a的类型相同,成员数相同,故可以将数组a赋值给数组bcout << "array类数组b等于数组a,b的第二个元素为b[1]=" << b[1] << endl;//显示数组b第2个元素,和数组a第二个元素相同system("pause");return 0;}
输出:
1请为数组第四个成员赋值:55第四个成员的值为55数组的成员数为:5array类数组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;
会在运行时提示出错
- (六十一)vector、array和数组
- 数组array和vector的比较
- 数组,array,vector
- 4.5 数组,模板类vector和array的比较
- c++ 的vector、array和数组的比较
- Array 和 Vector
- vector和array类
- array vector 和string
- Java的数组(Array)、Vector、ArrayList、HashMap的异同
- Java的数组(Array)、Vector、ArrayList、HashMap的异同
- Java的数组(Array)、Vector、ArrayList、HashMap的异同
- Java的数组(Array)、Vector、ArrayList、HashMap的异同
- 快速排序(基于顺序容器vector;基于数组array)
- C++中的数组array和vector,lambda表达式,C字符串加操作,C++中新类型数组(数组缓存),多元数组,new缓冲
- 读书笔记之array和Vector
- ActionScript中的vector和array
- C++ 数组array与vector的比较
- C++ 数组array与vector的比较
- 饿了么黑客马拉松参赛杂谈
- 黑马程序员------迭代器和增强for的使用
- Android示例java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.
- setContentView(R.layout.choose_area);找不到layout
- 接口和抽象类的区别
- (六十一)vector、array和数组
- ngnix根据UA跳转到不同站点
- 学习Python (九)
- 使用泛型实现单例模式提供者
- 解决网页百度转码的问题
- 黑马程序员_接口interface
- 易语言5.4一键破解工具
- linux下使用Eclipse编译调试C++ makefile项目
- [LeetCode212] Word Search II