p111~p114:
与旧代码的接口
1、C++程序中的C风格字符串:任何出现字符串字面值的地方都可以以空字符结束的字符数组来替代。
const char str[] = {"Hello, world"}; string s(str);
2、如果程序的某处需要一个C风格字符串:利用 s.c_str()返回。
示例:
#include<iostream> using std::cout; using std::cin; using std::endl; #include<string> using std::string; int main() { string s = "Hello, world"; const char *str = s.c_str(); // 结果指针的类型是const char* // 输出1 cout << str << endl; // 改变s的值之后,str可能会失去效用,如果想一直使用返回的数组,最好将该数组拷贝一份。 s += ", my name is jack."; // 输出2 cout << str << endl; return 0; }
输出结果:
3、使用数组初始化 vector对象。
(用于初始化 vector对象的值可能仅是数组的一部分,可以用arr+n来表示首尾元素的地址)
#include<vector> using std::vector; #include<iterator> using std::begin; using std::end; int main() { int int_arr[] = {0, 1, 2, 3}; vector<int> ivec(begin(int_arr), end(int_arr)); return 0; }
多维数组
1、谨记:严格来说,C++语言中没有多维数组,通常所说的多维数组其实是数组的数组。这一点,对今后理解和使用多维数组大有益处。
2、对于二维数组来说,常把第一个维度称为“行”,第二个维度称为“列”。
3、多维数组的初始化。(两种方式)
int ia[3][3] = { {0, 1, 2}, {4, 5}, // 初始化前第二行的前两个元素 {7, 8, 9} }
当然也可以:
int ia[3][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
(通常,只想初始化个别元素时使用第一种方式,其余元素会被“默认初始化”)。
4、多维数组的下标引用。以int arr[10][10][10];为例,
1)如果含有的下标运算符和数组维度一样多,
例如 arr[1][2][3];表示给定类型的元素,这里是 int型。
2)如果表达式含有的下标运算符数量比数组的维度小,则表达式的结果将是给定索引处的内层数组,
例如 arr[1][2];表示:通过索引1得到一个最外层数组,它含有10个数组,通过索引2获得其中一个含有10个int的数组。
5、多维数组的两种遍历方式:嵌套的for循环和范围for语句。
(注意,在使用range for遍历多维数组的时候, auto row : ia 中的row会转变为指针类型,导致内层循环不合法,
因此,即使是不改变数组的值,也应当写成 const auto &row : ia,也就是说,要使用范围for语句处理多维数组,除了最内层的循环外,都要用auto &)
练习 3.41
#include<vector> using std::vector; #include<iterator> using std::begin; using std::end; int main() { int int_arr[] = {0, 1, 2, 3}; vector<int> ivec(begin(int_arr), end(int_arr)); return 0; }
练习 3.42
#include<vector> using std::vector; #include<iterator> using std::begin; using std::end; #include<iostream> int main() { vector<int> vector{1, 2, 3, 4}; int arr[4]; int i = 0; for (int x : vector) { arr[i++] = x; } // 测试 for (int x : arr) { std::cout << x << std::endl; } return 0; }