因为小姚在学习数据结构和算法的时候发现,她的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间接获取所得
}
|