c++ - 为什么使用 C++ 容器 "array"而不是传统的 C 数组?

标签 c++ c++11 stl containers

流行的观点是 C++ 数组更安全,效率几乎相同。除了检查索引是否超出范围和不允许隐式类型转换为指针之外,还有其他功能吗?
此外,为什么传统 C 数组的隐式类型转换被认为是一种糟糕的方式?
我不太擅长 C++(也擅长英语),如果这个问题不值得回答,请原谅我。谢谢!

最佳答案

主要好处是std::arrayfirst-class object在 C++ 中,这意味着你可以用它做所有你可以用任何其他“普通”C++ 对象做的事情。
另一方面,传统的 C 数组不是一流的对象,这意味着很多事情都行不通:

#include <array>

// Works!
std::array<int, 5> ReturnAStdArrayOfSixes()
{
   std::array<int, 5> ret;
   ret.fill(6);
   return ret;
}

// Doesn't compile, sorry
int[5] ReturnACArrayOfSixes()
{
   int ret[5];
   for (int i=0; i<5; i++) ret[i] = 6;
   return ret;
}

int main(int, char **)
{
   std::array<int, 5> stdArray1;
   std::array<int, 5> stdArray2;

   int cArray1[5];
   int cArray2[5];

   stdArray1 = stdArray2;  // works
   cArray1 = cArray2;  // error: array type 'int [5]' is not assignable

   if (stdArray1 < stdArray2) {/* do something */}  // compares arrays' contents lexographically
   if (cArray1 < cArray2) {/* do something */}      // compiles, but compares pointers which probably isn't what you wanted

   return 0;
}
至于“传统 C 数组的隐式类型转换”(我认为您的意思是将数组类型隐式衰减为指针类型),这是一种有用的机制,但如果您不期望它,它会咬你,例如:
// This code works as expected
int myArray[5];
cout << "There are " << (sizeof(myArray)/sizeof(int)) << " items in myArray\n";
现在让我们将上面的代码重构为一个不错的函数,以便我们可以重用它:
void PrintArraySize(int myArray[5])
{
   std::cout << "There are " << (sizeof(myArray)/sizeof(int)) << " items in myArray\n";
}

int main(int, char **)
{
   int myArray[5];
   PrintArraySize(myArray);
   return 0;
}
......哦不!现在 PrintArraySize() 有问题,打印的数字远小于数组中的项目数! (原因是函数中的 myArray 已经隐式衰减为指针,所以函数中的 sizeof(myArray) 计算结果为 sizeof(int *) ,例如 4 或 8 个字节,而不是传入内容的大小大批)

关于c++ - 为什么使用 C++ 容器 "array"而不是传统的 C 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67133957/

相关文章:

c++ - 如何防止包括破损

c++ - 在 C++11 中,如何在 vector 上调用 std::max?

c++ - MSVC std::pair 实现:SFINAE 是否在此处正确应用?

c++ - 如何使用 std::wifstream 将其内容作为 std::wstring 读取

c++ - std::atomics 和 std::lock_guard 或仅 std::lock_guard

c++ - 类析构函数导致重载+运算符的问题

c++ - 如何使用内联汇编模拟以下 C++ 代码?

c++ - 编号的唯一文件

C++ 模板元编程, "static if"解决方法 - 可以改进吗?

C++ - 从可变参数模板创建元组