【问题标题】:When to use vectors and when to use arrays in C++?在 C++ 中何时使用向量以及何时使用数组?
【发布时间】:2012-06-07 14:44:59
【问题描述】:

我通常不确定什么时候使用一个比另一个更好。总的来说,它们似乎都在做同样的事情,但是向量在可以做什么方面更灵活吗?什么时候数组更合适?

【问题讨论】:

  • 我的建议是几乎从不使用数组。但是,数组是指type [] 还是std::array
  • 向量和数组在 C++ 意义上的主要区别在于,向量执行自动动态内存管理,而数组是固定的。

标签: c++ arrays vector


【解决方案1】:

我只在使用嵌入式系统或某些 API 需要它时才真正使用数组(即,将它们作为函数的参数)。此外,如果我只有一两个地方需要使用数组,或者不需要特别需要向量功能,那么使用数组更有意义,因为 vector.h 的额外开销。

否则,只需使用向量 :)

【讨论】:

  • 您可以在需要数组时传入向量:someFunc (&v[0]);
  • 你的另一点是有效的。根据您使用数组的方式和频率,以及程序的需要,向量的开销可能会很大。
  • @chris 你在说什么开销?向量存储容量的附加整数,仅此而已。实际上,无论如何,大多数应用程序都需要它。而且包含标头的开销可以忽略不计,而且在大多数情况下,当您编写现代 C++(某些嵌入式平台除外)时,它仍然存在。
  • @chris 啊,那你就错了。向量有 no 函数调用开销。事实上,在性能方面,它完全等同于使用 C 数组。实际上,我是百万分之一的程序员(曾在生物信息学库上工作过),所以我们确实非常仔细地衡量了这一点。
  • @crsn,类成员的顺序无关紧要。假设元素存在,v[0] 需要为您提供指向连续元素序列的第一个元素的指针(就像new int[5]返回的同一种指针)。
【解决方案2】:

通常总是更喜欢使用std::vector<T>,因为一旦向量超出范围,销毁将自动进行,分配的内存将整齐地放置在堆上,所有内存都会为您处理。 std::vector<T> 为您提供数组中的所有内容,甚至保证元素将连续存储在内存中(std::vector<bool> 除外)。

对于std::vector<bool>,你必须小心,因为这样的代码会中断:

 std::vector<bool> vb;
 vb.push_back(true);
 vb.push_back(false);
 vb.push_back(true);
 bool *pB = &vb[0];
 if( *(pB+1) )
 {
     // do something
 }

事实是,std::vector&lt;bool&gt; 不存储连续的bools。这是 C++11 中修复的标准中的一个例外。

【讨论】:

  • 幸运的是 std::vector&lt;bool&gt; 再次成为 C++11 中的真正容器
  • +1 for 整齐地放在堆上(强调我的),这意味着不小心写到数组外不会破坏堆栈。
猜你喜欢
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多