string
- string使用加法运算符必须确保运算符两侧的运算对象至少有一个string
迭代器
- 使用iterator和const_iterator表示迭代器的类型
vector<int>::iterator it;
vector<int>::const_iterator it2;
- begin和end返回的具体类型由对象是否是常量决定
vector<int> v;
const vector<int> cv;
auto it1 = v.begin();
auto it2 = cv.begin();
- 如果对象只需读无需写最好使用常量iterator。为了得到const_iterator类型的返回值,可以使用cbegin和cend
vector<int> v;
auto it3 = v.cbegin();
数组
- 数组的维度必须是常量表达式(第二章constexpr和常量表达式)
- 字符数组除了用列表初始化的形式初始化,还有一种自己独特的方式——用字符串字面值初始化。但是C++对字符串字面值(用双引号括起来的零或多个字符)会在字面值后添加空字符\0,所以用这个初始化长度要加1
char c1[] = {'C', '+', '+'};
char c2[] = {'C', '+', '+', '\0'};
char c3[] = "C++";
const char c4[6] = "Daniel";
int *ptrs[10];
int &refs[10] = ...
int (*parray)[10] = &arr;
int (&arrref)[10] = arr;
int *(&arry)[10] = ptrs;
- 在大多数表达式中,使用数组类型的对象其实是使用一个指向该数组首元素的指针
int ia[] = {1, 2, 3};
auto ia2(ia);
ia2 = 42;
decltype(ia) ia3 = {0, 1, 2};
ia3 = p;
ia3[2] = 3;
int ia = {0, 1, 2};
int *beg = begin(ia);
int *last = end(ia);
auto n = end(arr) - begin(arr);
int *p = &ia[1];
int j = p[1];
int k = p[-1];
int a[3] = {1, 2, 3};
int *c = a;
int *c = &a[0];
c += 2;
cout << c[-1] << endl;
int (*p)[3];
p = &a;
cout << p << endl;
cout << *p << endl;
cout << **p << endl;
cout << **(p + 1) << endl;
int aa[3][10];
aa + 1;
*(aa + 1);
*(aa + 1) + 5;
*(*(aa + 1) + 5);
int (*p)[10] = aa;
int *pi = aa[0];
int *pi = &aa[0][0];
- 使用范围for语句处理多维数组,外层循环的控制变量必须声明成引用类型。如果不加引用,会被系统转为对该数组内首元素的指针
- 要使用范围for语句,除了最内层循环,其他所有循环的控制变量都应该是引用
int ia[3][4] = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11}
};
for (auto &row : ia)
{
for (int col : row)
cout << col << " ";
cout << endl;
}