C++第九天 2016-12-08 3.5-3.6

来源:互联网 发布:网络管理控制软件 编辑:程序博客网 时间:2024/06/16 09:51

    重要 目标字符串的大小由调用者指定

    对于C风格字符串的连接,不能简单使用加法,会认为是指针的加法而没有意义,需要使用特定的函数strcatstrcpy,使用这两个函数需要提供用于存放字符串的足够大数组。

    strcpy(largeStr,ca1); //ca1拷贝给largeStr  strcat(largeStr, " "); //largeStr的末尾加上一个空格

    问题是largeStr的大小不容易估计准,而且largeStr的内容一旦改变就需要重新检查。所以一般来说,使用String库比使用C风格字符串更安全和高效。

    3.5.5与旧代码的接口

    有些程序可能在编写时候没有考虑到Stringvector,不能使用标准库。为了和这些数组并存,提供以下方案

    重要 混用String对象和C风格字符串

    允许使用字符串字面值初始化String对象,string s("Hello World");

    拓展到一般情况,任何出现字符串字面值的地方都可以以空字符结束的字符数组来替代

    1、可以为String初始化和赋值

    2String加法允许使用其中一个运算对象,复合运算中可以使用在右侧运算对象。

    但是反之不成立,不能用String初始化一个C风格字符串。有特定函数

    const char *str = s.ctr();可以看出c_str函数返回是一个C风格字符串,会跟着s的改变而改变,所以最好在使用时拷贝一份

    重要 使用数组初始化vector对象

    虽然vector不能初始化数组,但是数组可以初始化vector

    int int_arr[] = {0,1,2,3,4,5};vector<int> ivec(begin(int_arr),end(int_arr));

    beginend函数指出数组头尾的位置。

    尽量使用vector和迭代器,而避免使用数组和指针,尽量使用String避免使用C风格基于数组字符串。

    3.6多维数组

    严格来说,C++中并没有多维数组,通常说的数组其实是数组的数组。

    当一个数组的元素任然是数组时,通常使用两个维度来定义它:一个维度是数组本身大小,另一个维度表示其元素大小。

    重要 多维数组的初始化

    允许使用花括号括起来的一组值初始化多维数组,会自动适应元素格式。

    如果使用花括号进行括起来,则每个花括号代表新的一组数组开头值。

    重要 多维数组的下表引用

    每个维度对应一个下标运算符,如果取得下标数量和维度一样,则是定类型的元素,如果下标小于维度,则是给定索引处的一个内层数组。

    int (&row)[4] = ia[1]; row绑定到ia的第二个数量为4的元素数组上

    重要 使用范围for语句处理多维数组

    C++11新标准中,新增了范围for语句

    size_t cnt =0 ;   for(auto &row : ia)    for(auto &col :row) {col =cnt; ++cnt;}

    等于把数组ia中的位置索引值赋给保存的值。

    遍历过程中,需要适当使用“&”引用,以防会定义为指针类型而无法继续编译。

    for(const auto &row :ia) forauto col : row cout<<col <<endl;

    使用范围for语句处理多维数组,除了最内层的循环外,其它所有循环的控制变量都应该是引用类型。

    重要 指针和多维数组

    在使用多维数组的名字时候,会自动转换成指向数组首元素的指针

    int int p ia 〔 3 凵 4 0 & i a [ 2 ] ; / / 大 小 为 3 的 数 组 , 每 个 元 素 是 含 有 4 个 整 数 的 数 红 / / p 指 向 含 有 4 个 整 数 的 数 组 / / p 指 向 ia 的 尾 元 素

    如果没有括号 int *p[4] ;整形指针的数组

    C++新标准的提出,使用autodecltype就能尽量避免在数组面前加上一个指针了;

    可以使用标准库函数beginend给出指针位置。

    重要 类别名简化多维数组指针;

    比如定义一个【4】的数组可以使用using int_array = int[4] ;   typedef int int_array[4];就可以简化定义

0 0