动态和静态数组
Dynamic and static array
我正在学习 C++ 阅读 Stroustrup 的书,我认为这本书在这个主题(数组)中不是很清楚。据我了解,C++ 有(如 Delphi)两种数组:
声明为
的静态数组
int test[3] = {10,487,-22};
称为向量的动态数组
std::vector<int> a;
a.push_back(10);
a.push_back(487);
a.push_back(-22);
我已经看到了关于这个的答案(里面有很多行和概念)但是他们没有阐明我的概念。
据我了解,vector
s 消耗更多内存,但它们可以更改其大小(实际上是动态的)。相反,数组具有在编译时给出的固定大小。
Stroustrup 在章节中说向量是安全的而数组不是,但没有解释原因。我确实信任他,但为什么呢?安全的原因与内存的位置有关吗? (heap/stack)
我想知道为什么我要使用载体,如果它们是安全的。
我能看到的一个安全性是您无法访问 vector 中不存在的内容。
我的意思是,如果您 push_back 只有 4 个元素并且您尝试访问索引 7,那么它将返回一个错误。但在数组中并没有发生。
简而言之,它会阻止您访问损坏的数据。
编辑:
程序员必须将索引与 vector.size() 进行比较才能抛出错误。它不会自动发生。必须在 himself/herself.
之前完成
数组不安全的原因是内存泄漏。
如果声明动态数组
int * arr = new int[size]
而你不做 delete [] arr,那么内存仍然没有清除,这就是所谓的内存泄漏。应该注意的是,任何时候你在 C++ 中使用 new 这个词,那里的某个地方必须有一个 delete 来释放那块内存。如果你使用malloc(),那么就应该使用free()。
http://ptolemy.eecs.berkeley.edu/ptolemyclassic/almagest/docs/prog/html/ptlang.doc7.html
数组也很容易越界,例如在索引中插入一个大于其大小 -1 的值。使用矢量,您可以 push_back() 任意数量的元素,矢量将自动调整大小。如果你有一个大小为 15 的数组,你试着说 arr[18] = x,
然后你会得到一个分段错误。该程序将编译,但当它到达将其置于数组边界之外的语句时将崩溃。
一般来说,当你有大量代码时,很少使用数组。向量几乎在所有方面都客观地优越,因此使用数组变得毫无意义。
编辑:正如 Paul McKenzie 在评论中指出的那样,超出数组边界并不能保证出现分段错误,而是未定义的行为,由编译器决定会发生什么
让我们以从文件中读取数字为例。
我们不知道文件中有多少数字。
要声明一个数组来保存数字,我们需要知道容量或数量,这是未知的。我们可以选择一个像 64 这样的数字。如果文件中的数字超过 64 个,我们就开始覆盖数组。如果文件少于 64 个(比如 16 个),我们就是在浪费内存(不使用 48 个槽)。我们需要的是动态调整容器(数组)的大小。
要动态调整数组的容量,必须创建一个更大的新数组,然后复制元素并删除旧数组。
std::vector
将根据需要调整其容量。它为您处理内存的动态分配。
另一方面是将容器传递给函数。使用数组,您需要传递数组和容量。使用std::vector
,你只需要传递向量。可以查询矢量对象的容量。
我正在学习 C++ 阅读 Stroustrup 的书,我认为这本书在这个主题(数组)中不是很清楚。据我了解,C++ 有(如 Delphi)两种数组:
声明为
的静态数组int test[3] = {10,487,-22};
称为向量的动态数组
std::vector<int> a;
a.push_back(10);
a.push_back(487);
a.push_back(-22);
我已经看到了关于这个的答案(里面有很多行和概念)但是他们没有阐明我的概念。
据我了解,vector
s 消耗更多内存,但它们可以更改其大小(实际上是动态的)。相反,数组具有在编译时给出的固定大小。
Stroustrup 在章节中说向量是安全的而数组不是,但没有解释原因。我确实信任他,但为什么呢?安全的原因与内存的位置有关吗? (heap/stack)
我想知道为什么我要使用载体,如果它们是安全的。
我能看到的一个安全性是您无法访问 vector 中不存在的内容。
我的意思是,如果您 push_back 只有 4 个元素并且您尝试访问索引 7,那么它将返回一个错误。但在数组中并没有发生。
简而言之,它会阻止您访问损坏的数据。
编辑:
程序员必须将索引与 vector.size() 进行比较才能抛出错误。它不会自动发生。必须在 himself/herself.
之前完成数组不安全的原因是内存泄漏。
如果声明动态数组
int * arr = new int[size]
而你不做 delete [] arr,那么内存仍然没有清除,这就是所谓的内存泄漏。应该注意的是,任何时候你在 C++ 中使用 new 这个词,那里的某个地方必须有一个 delete 来释放那块内存。如果你使用malloc(),那么就应该使用free()。
http://ptolemy.eecs.berkeley.edu/ptolemyclassic/almagest/docs/prog/html/ptlang.doc7.html
数组也很容易越界,例如在索引中插入一个大于其大小 -1 的值。使用矢量,您可以 push_back() 任意数量的元素,矢量将自动调整大小。如果你有一个大小为 15 的数组,你试着说 arr[18] = x, 然后你会得到一个分段错误。该程序将编译,但当它到达将其置于数组边界之外的语句时将崩溃。
一般来说,当你有大量代码时,很少使用数组。向量几乎在所有方面都客观地优越,因此使用数组变得毫无意义。
编辑:正如 Paul McKenzie 在评论中指出的那样,超出数组边界并不能保证出现分段错误,而是未定义的行为,由编译器决定会发生什么
让我们以从文件中读取数字为例。
我们不知道文件中有多少数字。
要声明一个数组来保存数字,我们需要知道容量或数量,这是未知的。我们可以选择一个像 64 这样的数字。如果文件中的数字超过 64 个,我们就开始覆盖数组。如果文件少于 64 个(比如 16 个),我们就是在浪费内存(不使用 48 个槽)。我们需要的是动态调整容器(数组)的大小。
要动态调整数组的容量,必须创建一个更大的新数组,然后复制元素并删除旧数组。
std::vector
将根据需要调整其容量。它为您处理内存的动态分配。
另一方面是将容器传递给函数。使用数组,您需要传递数组和容量。使用std::vector
,你只需要传递向量。可以查询矢量对象的容量。