首页 > 编程语言 > 详细

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

时间:2019-12-23 23:33:39      阅读:148      评论:0      收藏:0      [点我收藏+]

原文来自: https://shendrick.net/Coding%20Tips/2015/03/15/cpparrayvsvector.html @Seth Hendrick
Original article: https://shendrick.net/Coding%20Tips/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];

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

原文:https://www.cnblogs.com/yaos/p/12088867.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!