程序员的任务就是将计算表达出来,并且做到:
- 正确
- 简单
- 高效
目前的手段主要是把一个大的计算任务划分为许多小任务。这一技术主要包括两类方法:
- 抽象:即不需要了解的程序具体实现细节被隐藏在相应的接口之后。
- 分治:即把一个大问题分为几个小问题分别解决。
除了个别情况(例如0和1),程序中应该尽量少用字面常量,而是尽可能地使用符号常量。在代码中,这种不能被直接识别的字面常量通常被戏称为魔术常量。
C++98不支持constexpr,大家用const替代。
需要注意的是,表达式a<b<c表示(a<b)<c,即true<c或者false<c。
增量表达式至少有三种形式:
++a
a+=1
a=a+1
哪种方式比较好?建议使用第一种方式,它直观地表示了增量的含义。
记号type(value)和type{value}表示“将value转换为type类型,就像用值value来初始化type类型的变量一样”。使用type{value}可以避免窄化转换,而type(value)不能。
double d=2.5;
int i=2;
double d2=d/i; //d2==1.25
int i2=d/i; //i2==1
int i3{d/i}; //错误:double→int可能是窄化转换
d2=d/i; //d2==1.25
i2=d/i; //i2==1
vector是一组可以通过索引来访问的顺序存储的数据元素。其中,第一个数据元素是索引号0,第二个是1,以此类推。我们可以用vector名和索引号的组合来表示一个具体的数据元素。vector可以用如下形式表示:
vector<int> v = {5,7,9,4,6,8};
定义一个vector需要确定vector的数据类型和始集。数据类型在紧跟vector名的<>内定义(如<int>)。下面是另一个示例:
vector<string> philosopher = {"Kant", "Plato", "Hume", "Kierkegaard"};
一个vector只能存储与其数据类型相同的数据。当给定大小的vector被定义后(未被指定数据元素的值),根据数据类型的不同,将被赋予不同的缺省值。
遍历一个vector:
vector<int> v = {5, 7, 9, 4, 6, 8};
for(int i=0;i<v.size();++i)
cout << v[i] << '\n';
for(int x:v)
cout << x << '\n';
使用push_back(),将一个新的元素添加到vector中,该元素成为vector的最后一个元素:
vector<double> v; //初始状态vector中没有元素
v.push_back(2.7); //现在v[0]==2.7
v.push_back(5.6); //现在v包含两个元素:v[1]==5.6
v.push_back(7.9); //现在v中包含三个元素:v[2]==7.9
vector的大小可以通过调用成员函数size()获得。初始时v.size()的值是0,三次调用push_back()后,v.size()的值变为3.