【问题标题】:C++ Vector<int> array initializationC++ Vector<int> 数组初始化
【发布时间】:2017-01-10 05:09:19
【问题描述】:

给定以下代码:

vector<int> A[1000000];
for( int i = 0; i < 1000000; i++ ){
    A[i].clear();
}

我在一个自动化终端上运行它,该终端上的测试用例与我的代码一起运行,因此我无法获得完整的调试消息。我没有收到任何错误,并且该程序似乎在单个测试用例中运行良好。但是,当我运行完整的测试用例时,我会随机通过/失败测试用例(一次我可能通过前 3 个,另一个我通过了除它们之外的所有内容,另一个我只通过了第二个,等等)。我想确保这种初始化会消除数组上的“未定义”值(例如char *buffer = new char[100]; buffer[0] = 0;),这样它就不会导致随机崩溃。

sizeof(A) == 24000000 (~23MB)、sizeof(int) == 4。我只向这些向量(总共)添加了最多 100 万个整数,因此在最坏的测试中,每个向量可能是一个元素向量,或者单个向量可能有 100 万个整数,而其余的保持为空。

我必须调用析构函数吗?我假设不是,因为我从未调用过 new,但我是 STL 的新手。最后,这可能不是我的代码问题,而是测试人员,但仍然希望确保这对我来说没问题。

【问题讨论】:

  • 这段代码没问题,其他地方可能有错误。或者堆栈溢出
  • 你试过了吗,vector&lt;int&gt; A(1000000,0);?这将用零填充向量。
  • @tinstaafl 是单个向量,OP 代码生成一百万个向量(我认为这是故意的)
  • 在编译器中检查 sizeof(int),如果是 2 字节,那么 for 循环就是罪魁祸首。
  • @MM 是的。它是 100 万个向量(它们之间将容纳 100 万个整数,所以这不应该是内存不足的原因),而不是一个 100 万个元素向量。我猜它是测试代码然后......

标签: c++ arrays vector stl initialization


【解决方案1】:

我认为这是堆栈溢出,正如 M.M 所建议的那样。线

std::vector<int> A[1000000];

在堆栈上创建一百万个向量对象,这太多了。在我的机器上,该示例在一百万个向量上失败了,但在一千个向量上运行良好。

【讨论】:

  • 你确定吗? sizeof(A) 向我返回 24000000,即只有 23MB 我只会将 100 万个整数添加到这些向量(总共),因此每个向量可以是一个元素向量,或者单个向量可以有 100 万个,而其余的保持空的。
  • 例如,Visual Studio 中的默认堆栈大小为 1 MB。改为使用 new 运算符在堆上创建向量数组。
  • 不要使用 new ... 向量的向量,或向量数组的 unique_ptr 都更可取
  • 23MB 当然对于堆栈来说太大了,所以你必须在堆上分配。在这种情况下,我会尽量避免使用new。相反,您可以使用向量向量:std::vector&lt;std::vector&lt;int&gt; &gt; A(1000000);.
  • @cthl 可以将堆栈大小修改为千兆字节。不过,似乎可能会超过常见编译器的默认堆栈大小。
【解决方案2】:

在下面的代码中使用 for 循环

std::fill(A.begin(), A.end(), 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多