• C++ Arrays, std::array, std::vector 总结


    原文来自: https://shendrick.net/Coding Tips/2015/03/15/cpparrayvsvector.html @Seth Hendrick
    Original article: https://shendrick.net/Coding Tips/2015/03/15/cpparrayvsvector.html @Seth Hendrick

    C-Style 数组

    赋值

    int myArray[3] = {1, 2, 3};
    

    数组与指针

    a[1]等价于*(a+1)

    std::cout << std::boolalpha << (myArray[0] == *myArray) << std::endl;
    std::cout << std::boolalpha << (myArray[1] == *(myArray + 1) << std::endl;
    
    // Outputs:
    // true
    // true
    

    数组大小

    int myArray[5] = {1, 2, 3, 4, 5};
    size_t arraySize = sizeof(myArray) / sizeof(int);
    std::cout << "C-style array size: " << arraySize << std::endl;
    // Outputs:
    // C-style array size: 5
    
    #include <iostream>
    
    void printSize(int someArray[5]) {
        std::cout << sizeof(someArray)/sizeof(int) << std::endl;
    }
    
    int main() {
        int myArray[5] = {1, 2, 3, 4, 5};
        printSize(myArray);
    }
    
    // Outputs:
    // 2
    

    第二个例子中, 函数没有返回正确的数组大小. 这是因为数组作为输入参数时, 传入的是一个size_t大小的指针, 在具体机器上大小可能为8字节, 而int类型大小是4个字节, 因为第二个例子相当于sizeof(size_t) / sizeof(int), 输出结果为2.

    遍历循环

    与上面一个小节类似, 在同一个作用范围内, 数组可以用C++11的遍历循环,

    int main() {
       int myArray[5] = {1, 2, 3, 4, 5};
       for (int &i : myArray) {
           std::cout << i << ", " << std::endl;
       }
    }
    

    但是当数组被传入其他函数作为变量时, 遍历循环失效

    #include <iostream>
    
    void printElements(int someArray[5]) {
        for (int &i : someArray) {
            std::cout << i << ", " << std::endl;
        }
    }
    
    int main() {
        int myArray[5] = {1, 2, 3, 4, 5};
        printElements(myArray);
    }
    

    原因还是一样, 被传入的是指针.

    std::array

    std::array是一个包装后的C数组, 在编译的时候必须确定数组大小.

    声明数组

    #include <array>
    #include <iostream>
    
    void printElements(const std::array<int, 5> &someArray) {
        for (const int &i : someArray) {
            std::cout << i << ", " << std::endl;
        }
    
        std::cout << "Size: " << someArray.size() << std::endl;
    }
    
    int main() {
        std::array<int, 5> myArray = {1, 2, 3, 4, 5};
        printElements(myArray);
    }
    
    // Outputs:
    // 1,
    // 2,
    // 3,
    // 4,
    // 5,
    // Size: 5
    

    std::vector

    std::array是C数组的封装, std::vector则完全不同于原来的C数组, 是heap上的动态数组, 数组大小在编译的时候可以不确定.

    std::array可以看成如此封装

    int a[5];
    

    std::vector则是

    int *a = net int[5];
    
  • 相关阅读:
    解决 DBMS_AW_EXP: BIN$*****==$0 not AW$
    物化视图(materialized view) 实现数据迁移、数据定时同步
    Mysql exists 与 in
    ORACLE DATAGUARD 进程
    ORACLE DATAGUARD SWITCHOVER 步骤
    Oracle Dataguard failover 操作步骤
    Python 包管理(PYPA)
    Emacs Org-mode 4 超连接
    Emacs Org-mode 3 表格
    ycmd for emacs 代码自动补全
  • 原文地址:https://www.cnblogs.com/yaos/p/14014214.html
Copyright © 2020-2023  润新知