Essential C++学习记录&笔记整理5(如何运用Array和Vector)

说实话从这节开始就和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]<<' ';

总之,理解这些东西不很容易,需要经过不断钻研和实践来体会!
2020.4.12
涉及到了vector类的引用问题,一直以为是vector和C语言里的数组别无两样,实际上vector还是一个对象,引用(&)它还是要加上&,否则不是传址调用。

  • “传递数组说白了其实是传递数组的地址进来,可以直接通过这个地址来修改数组的内容,而vector是一个类实现的数组,你传递vector对象其实是传递对象的一个复制,这样你对传进来的vector修改,并不会影响原来的vector,因此需要用&引用传递,当然,你传递指针也是可以的”——引自Italink的回答

  • “vector是一个类,c风格数组是指针,vector只是能当数组用而已,但实质还是一个变量”——引自某群一名热心群友的回答

  • 所以,我的理解是“vector本质上是个对象,若要在函数中修改vector,就得按照对象的性质,对函数进行传址操作,即在vector对象的名字前加个&,才能修改vector,否则是复制了vector对象(相当于复制整个数组的值而非数组的地址)。数组不一样,数组名本身就是地址,所以不必加&。”


  1. 《计算机科学概论》(第五版)第8章P161页——容器的定义 John·Lewis,Nell·Dale著 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值