zoukankan      html  css  js  c++  java
  • 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];
    
  • 相关阅读:
    .NET Interop 工具集
    关于正弦波的算法
    Windows Phone 系列 本地数据存储
    Xaml cannot create an instance of “X”
    Windows Phone 系列 使用 MVVM绑定时无法获取当前值
    Windows Phone 系列 应用程序图标无法显示
    Windows Phone 系列 WPConnect无法上网的问题
    Windows Phone 系列 使用 Windows Phone 保存铃声任务
    WP7.5提交应用
    Windows Phone 系列 动态删除ObservableCollection
  • 原文地址:https://www.cnblogs.com/yaos/p/14014214.html
Copyright © 2011-2022 走看看