说实话从这节开始就和C产生了隔阂了,很多知识都是新知识了,不好理解,尤其是这一节,我读了两遍,总算明白了些东西吧,实际上这还有很多需要了解的东西,慢慢了解去!
如何运用Array和 Vector
1.容器的定义
- 容器:存放和操作其他对象的对象。1
2.array数组和Vector类
- 在C++中,我们可以用其内置的array(数组)类型或标准库提供的vector类来定义容器。
- 建议用vector,但现在大量程序代码都使用array
- 定义array时:
1.必须指定array的元素类型
2.还要赋予array一个名称
3.并指定array所能存储的元素个数 - array的大小必须是个常量表达式(即一个不需要在运行时求值的表达式)
//例子:
const int seq_size=18;
int pell_seq[seq_size];
- 定义vector时:
1.必须包含vector头文件
2. 由于vector是个class template(模板类),所以我们必须在类的名字之后的<>内指定其元素类型
3.vector的大小写在小括号中,此处所给予的大小不一定得是个常量表达式
//例子:
#include<vector>
vector<int>pell_seq(seq_size);
- 无论array还是vector,我们都可以指定容器中的某个位置,进而访问该位置上的元素。这里用到索引操作,索引操作通过下标运算符([ ])达成
- 注意:容器的第一个元素位置为0!!!不是1!!!避免off-by-one!!!
//例子:指定pell数列的前两个元素值
pell_seq[0]=1;//指定第一个元素的值为1
pell_seq[1]=2;//指定第二个元素的值为2
for循环的条件表达式若在进入for循环的第一次求值是false,那么for循环直接跳过,不会执行步进表达式(废话)- 可以在for循环的三个表达式处留空,不写任何东西
//例子:
int ix=0;
//...
for(;ix<seq_size;++ix)
//...
- 初始化列表内的元素个数,不能超过array的大小!
- 如果初始化列表内的元素个数小于array的大小,剩下的元素值均给初始化为0
- 还可以让编译器根据初值的数量,自行计算出array的大小。eg.
int elem_seq[]={1,2,3,3,4,7};
此时array(elem_seq)的大小为6。 - vector不支持上述这种初始化列表。但vector允许我们可以为其每个元素指定每个元素的值(挨个=赋值)
- vector可以用一个已经初始化的array作为该vector的初值
int elem_vals[seq_size]={1,2,3,3,4,7};
vector<int>elem_seq(elem_vals,elem_vals+seq_size)
括号内的两个值都是实际内存位置,标示出了“用以将vector初始化”的元素的范围。(关于赋值范围,你可以理解为对应复制方式的赋值,一一对应这样的,就不难理解这个范围了,这也是个规定,记住就好!)
- vector知道自己的大小是多少,即定义vector类型的变量可以用变量名.size()来获取这个vector所包含元素的个数
//例子:
cout<<"The first"<<elem_seq.size()<<"...."
for(int ix=0;ix<elem_seq.size();++ix)
cout<<pell_seq[ix]<<' ';
- 关于array、vector和C语言里数组的区别请看这篇文章【C++】array和vector,数组三者区别和联系——忽晴忽雨江湖的博客
总之,理解这些东西不很容易,需要经过不断钻研和实践来体会!
《计算机科学概论》(第五版)第8章P161页——容器的定义 John·Lewis,Nell·Dale著 ↩︎