《Essential C++》学习DAY1|数组向量与指针

因为小姚在学习数据结构和算法的时候发现,她的C++基础十分薄弱,于是这一系列笔记为自学《Essential C++》划重点系列,希望能对C++的初学者有所帮助!

一、C++编程基础

1.用来处理“多值初始化”的构造函数初始化语法

#include<complex>
complex<double> purei(0,7);
//<>表示complex是一个template class(模板类),template class允许
//我们在“不必指明data members型别”的情况下定义class

2.条件运算符

a?b:c表示若a=True,则执行b;若a=False,则执行c

3.++在前和在后的区别

cout<<++a;
//上式中的a在被打印之前就已经进行了递增运算,所以打印出来的是a+1
cout<<a++;
//上式中的a在被打印出来之后才进行递增运算,所以打印出来的是a

4.如何运用数组和向量

4.0 背景

背景:程序要显示不同的元素值,而这些元素值要出自不同的数列

解决之道:使用可存放连续整数值的容器(container)型别,这种型别不仅允许我们以名称(name)来取用容器中的元素,也允许我们以容器中的位置来取用元素。C++允许我们以array型别或者标准程序库提供的vector类来定义容器。下面我们分别来介绍array和vector。

4.1 应用

 4.1.1 定义

//array的定义
//array的尺度必须是个常量表达式,也就是一个不需要在执行期计算其值的表达式
const int seq_size = 18;
int pell_seq[seq_size];
//vector object的定义,首先必须含入vector头文件,vector<元素型别>名字(尺度)
# include <vector>
vector<int> pell_seq(seq_size);

如何将适当的值填入container中呢?对于array,我们可以指定初始化序列(initialization list)

int elem_seq[seq_size] = {
    1,2,3
};

 其实可以让让编译器根据初值的数量,自行计算出array的容量

int elem_seq[] = {
    1,2,3,4,5,6
};

vector不支持上述这种初始化序列,有个冗长的写法可以为每个元素指定特定值

vector<int> elem_seq(seq_size);
elem_seq[0]=1;
elem_seq[1]=2;
elem_seq[2]=3;
elem_seq[3]=4;

另一个做法是利用一个已经初始化好的array作为vector的初值

int elem_vals[seq_size] = {
    1,2,3,4,5,6,7
};
//用elem_vals的值来初始化elem_seq
vector<int>elem_seq(elem_vals,elem_vals+seq_size)
//传入的这两个值都是实际内存位置,表示“用以将vector初始化的元素范围”

4.1.2 位置元素与读取

//索引操作通过下标运算符完成,容器的第一个元素位置为0而不是1
pell_seq[0]=1;//指定第一个元素值为1
pell_seq[1]=2;//指定第二个元素值为2
//要依次迭代vector或array中的多个元素
for(int ix=2; ix<seq_size; ++ix)
    pell_seq[ix] = pell_seq[ix-2] + 2*pell_seq[ix-1];
elem_seq.size() //会返回elem_seq这个vector所包含的元素个数
for(int ix = 0;ix < elem_seq.size(); ++ix)
    cout<<pell_seq[ix];

 发现,被定义的位置元素的变量是可以进行运算的

5.指针带来弹性

 例1:

//将pi的初值设为ival所在的内存地址
int *pi = &ival//只是定义的时候这样写,但实际上是pi=&ival哦
//其中pi是个int型别的对象的指针
//指针指向的是地址,&是取址运算符
//指针既可以让我们操控指针内含的内存地址,也可以让我们操控指针所指的对象值
pi;//核定pi所含有的内存地址,此举形同操纵指针对象本身
*pi;//核定ival的值,等于是操控pi所指的对象

例2

对于我们的6个vector对象(代表6种数列)

vector<int> fibonacci, lucas, pell, triangular, square, pentagonal
//可以用指针系来指向vector<int>
vector<int> *pv = 0;
//pv可以依次指向每一个用于表示数列的vector
pv = &fibonacci;
pv = lucas;
...
//但这种方式会牺牲程序的透明性,另一种解法是将每个数列的内存地址存入某个vector中
//于是我们可以通过索引的方式,透明的存取这些数列
const int seq_cnt = 6;

//一个指针数组,容量为seq_cnt
//每个指针都指向vector<int>对象
vector<int> *seq_addrs[seq_cnt] = {
    &fibonacci,&lucas,&pell,
    &triangular,&square,&pentagonal
};
//seq_addrs是一个数组
seq_addrs[0]//就是fibonacci vector的地址
//那我们就通过一个索引值来存取个别的vector
vector<int> *current_vec = 0;
for(int ix = 0 ; ix < seq_cnt ; ++ix)
{
    current_vec = seq_addrs[ix];
    //所有想要显示的元素都通过current_vec间接获取所得
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值