原文来自: 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
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