再一次遇到 vector 这个单词; 每一次见到这个单词都感觉这个单词非常的 "高大上"; 数字遇到vector马上就可以360度旋转;
当 "电" 遇到vector,马上让交流可以变得和直流一样进行控制(德国电气工程师的矢量控制理论,目前在工控界对电机控制应用
非常广泛,是变频器控制的基础理论,可惜的是中国目前没有这方面的真正的专家, 就是IT行业中的TI公司的TMS320LF24xx系列
DSP做的事,中国的基础理论的研究真的是落后于西方发达国家很多年),而在C++中遇到这个单词,同样是高大上的感觉,马上
让我想起C语言中最复杂的部分指针; 别说指针的操作你无所谓, 就算你是C++、C#、Java的粉丝;没有指针,个人感觉就像没
有金箍棒的猴子, 幻刺模糊直接让你子弹到处乱飞。
不瞎扯啦,开始今天的内容。
一、vector
1、作用
vector,从翻译对应的词语: 容器, 可以知道vector是用来装东西的罐子、坛子之类的东西;联系实际,坛坛罐罐可以用来装各
种不同的东西, 可以用来盛酒, 也可以用来放酸菜(南北朝鲜的酸菜就算啦),当然你如果是土豪的话,也可以用来放钢镚;如果你
是贪官的话,也可以用来藏你给情妇写的保证书什么的。
从C++的角度来看,vector可以用来存放不同类型的对象,例如可以把int类型的对象存放到容器里面,同样也可以将char类型的
对象存储到vector中,也可以将string对象存储到vector里面。
2、容器的定义
vector类型是C++标准库提供的一种类型,如果要在程序中引用这种类型,当然需要“报备”, 如下所示:
#include//引用相关的头文件using std::vector; //方便的使用std::命名空间/名字空间中的名字vector
报备完成后就可以名正言顺的经营啦;要使用 vector 必须指明容器里面存放的是什么类型的对象,就像在坛坛罐罐上面贴上标签
告诉别人里面存放的是什么;通过在 vector后面加上 <> 然后将对象类型写入到 <> 就可以啦, 如下所示:
vector vInt;
如上就定义了一个容器对象, 并且这个容器是用来存储int类型的对象的。
要点:尖括号里面指出的是容器中存放的是什么类型的对象; 同时要注意的是 vector<int>是一种数据类型,
vector可以存储的对象不仅可以是内置类型,还可以是用户的自定义类型,例如string类。
vectorvString;
同样 vector<string> 也是一种新的数据类型, 这种数据类型的对象用来存储string对象。
3、容器的初始化
标准库提供的vector类型有多种初始化方式。
A: vector<T> v1; //容器对象v1保存类型为T的对象, 容器类型的默认构造函数初始化对象v1为空
这样定义的话,就是定义了一个容器,里面没有任何东西,就相当于一个空的坛子、罐子。
B: vector<T> v2(v1); //容器对象v2保存类型为T的对象, 对象v2初始化为与v1一样的容器
这样定义的话,就表示开始的时候有一个罐子v1,然后又造了一个罐子v2,v2罐子是按照罐子v1为原型造的,如果v1里面有东西
那么v2罐子里面的东西与v1罐子一样; 如果v1罐子里面没有东西,那么v2罐子里面也没有东西。
C: vector<T> v3(n, i); //容器v3保存类型为T的对象, 对象初始化为保存n个类型为T、值为 i 的对象元素
这样定义的话,就表示下了一个明确订单, 就是告诉你,你给我造一个罐子v3, 里面放多少封(n)给情妇的保证书(i)。
D: vector<T> v4(n); //容器v4保存类型为T的对象, 容器对象v4中初始化里面可以存放个数为n的T对象。
这样的定义的话,就是下了一个明确的订单, 你给某个贪官造个罐子v4, 这个罐子可以放多少(n)封给情妇的保证书, 但是你不能
放保证书,放保证书的事情让贪官自己以后放。
Exp:
[root@localhost cpp_src]# cat test.cpp #include#include #include using std::cin;using std::cout;using std::endl;using std::string;using std::vector;int main(){ vector vInt1; vector vInt2(vInt1); vector vInt3(3,4); vector vInt4(5); string str("volcanol"); vector vStr1; vector vStr2(vStr1); vector vStr3(4,str); vector vStr4(5); return 0;}
这里需要注意的是, 对于存储string对象容器,可以用字符串字面值进行初始化, 如下所示:
vectorstr(4, "volcanol");
4、容器元素的值的初始化
一定要分辨清楚容器的初始化和容器元素的值的初始化两个概念, 容器的初始化可以包括两个方面:容器本身的初始化
以及容器元素的值的初始化。
这里就细细的说一下这两个的不同之处。
A: vector<int> vInt; 这里对容器对象vInt进行初始化,初始化后知道对象vInt是一个空的对象,里面暂时不能存
放任何int对象, 就是说这个坛子是一个实心的坛子,不能往里面塞东西。
B:vector<int> vInt1(2, 10); 这里不但对容器对象vInt1进行了初始化,同时还对容器对象里面的元素进行了初始化,
就是说容器里面存放了两个int类型的对象,且两个int对象的值均为10. 用坛坛罐罐来比喻就是罐子里面放了2个(初始化的是容器)
10元的钢镚(初始化的是容器里面的钢镚的大小)。
C: vector<int> vInt2(10); 这里对容器vInt2进行了初始化,而且在容器里面目前可以放10个int对象,而且这些int对象
的值为0。 用坛坛罐罐来比喻的话就是罐子里面放了10个面值为0元的钢镚。
要点:
如果容器存放的对象类型为内置类型,且没有提供容器元素的初始化值,那么就会初始化容器的元素值为0.
例如:
vector<char> vCh(1); 那么容器vCh里面就有一个元素之为'\0'的的char对象。
如果容器存放的对象是类类型,且没有提供容器元素的初始化值,那么容器元素就会用类类型默认构造函数对容器的
元素进行初始化。
例如:
vector<string> vStr(2); 那么容器vStr里面就存放了两个值为空""字符串的string对象。
如果容器存放的对象是类类型,同时类类型没有默认构造函数,且没有提供元素的初始化值, 那么标准库同样会产生
一个带初始值的对象,这个对象的每个成员都进行了初始化。(这个地方说的有点不明不白,我也是每天搞明白,有哪位大侠了
解的话,请不吝赐教)。
5、vector提供的操作
vector类提供了类似于string类的操作。
v.empty(); 检测对象v是否为空
v.size(); 返回对象v中的元素的个数
v.push_back(t); 往对象v中插入一个值为(t)新的元素, 这个就是动态的增加容器对象的容量,
v[n]; 访问容器中的元素, 相当于string对象的下标操作,而且容器对象下标操作符返回的是一个左值,可以进行写入操作。
v1 = v2; 容器的赋值操作, 就是将容器对象v1的元素替换为v2中元素的副本,(这需要注意容器的大小)
v1 == v2; 如果容器v1与v2相等,那么就返回true, 这里包括容器本身以及容器中的元素,这个必须要注意。
>, >=, != , <, <= 这些操作保持原本的意义。
Exp1:size() 和 empty()操作
[root@localhost cpp_src]# cat test.cpp #include#include #include using std::cin;using std::cout;using std::endl;using std::string;using std::vector;int main(){ vector vInt1; vector vInt2(vInt1); vector vInt3(3,4); vector vInt4(5); cout<<"the size of vector vInt1 is:"< <