说实话从这节开始就和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,数组三者区别和联系——忽晴忽雨江湖的博客
总之,理解这些东西不很容易,需要经过不断钻研和实践来体会!
2020.4.12
涉及到了vector类的引用问题,一直以为是vector和C语言里的数组别无两样,实际上vector还是一个对象,引用(&)它还是要加上&,否则不是传址调用。
-
“传递数组说白了其实是传递数组的地址进来,可以直接通过这个地址来修改数组的内容,而vector是一个类实现的数组,你传递vector对象其实是传递对象的一个复制,这样你对传进来的vector修改,并不会影响原来的vector,因此需要用&引用传递,当然,你传递指针也是可以的”——引自Italink的回答
-
“vector是一个类,c风格数组是指针,vector只是能当数组用而已,但实质还是一个变量”——引自某群一名热心群友的回答
-
所以,我的理解是“vector本质上是个对象,若要在函数中修改vector,就得按照对象的性质,对函数进行传址操作,即在vector对象的名字前加个&,才能修改vector,否则是复制了vector对象(相当于复制整个数组的值而非数组的地址)。数组不一样,数组名本身就是地址,所以不必加&。”
《计算机科学概论》(第五版)第8章P161页——容器的定义 John·Lewis,Nell·Dale著 ↩︎