模板类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; 会在运行时提示出错 |