2017-04-08 72 views
0

我一直在做一些阅读,关于如何创建一组数字并在C++中使用for循环填充这些数组。到处都说我需要使用矢量。我已经创建了数组并使用向量填充它们(我认为)。当我编译并运行显示数组时,一切正常。当我尝试显示数组的内容时,程序编译好,但运行时崩溃。在屏幕上显示矢量

我想创建100个数组,每次增加500个元素。 (这是一个任务,我们需要测试的算法的有效性。)

unsigned int numArrays = 100; 
unsigned int arraySize = 0; 
//Create holder variable: 
unsigned int randomInt = 0; 
//Create the arrays: 
std:vector<std::vector<int> > arrays(numArrays); 

for(std::size_t i=0; i< numArrays; i++){ 

    arraySize = i * 500; 
    vector<int> temp; 
    temp.reserve(arraySize); 

    for(int j=0; j< arraySize; j++){ 

     //Generate Random number: 
     randomInt = rand(); 
     //Add the number to the array: 
     temp.push_back(randomInt); 

    } 
    arrays.push_back(temp); 
} 


for(int i=0; i<arrays.size(); i++){ 

    cout << "{"; 
    for(int j=0; j<arrays.at(i).size() - 1; j++){ 

     cout << arrays.at(i).at(j) << ","; 

    } 
    cout << arrays.at(i).back() << "}" << endl; 
} 

我认为错误是某处最终嵌套循环,但我不知道。提前致谢。

+0

没有什么东西突出在我身上。但是你有没有试过调试这个程序?使用gdb?你应该可以运行它,然后回溯到错误发生的地方 – silvergasp

回答

1
std:vector<std::vector<int> > arrays(numArrays); 

在这里,你有numArraysvector<int>的initialize您的载体。
但是然后你追加你的新载体。意思是你在末尾有2*numArrays载体。

碰撞来自矢量的前半部分:

  • 负1 j<arrays.at(i).size() - 1size()返回一个无符号0,负1是最大值。
  • arrays.at(i).back()试图获取不存在的最后一个元素。

要解决该问题,通过

std::vector<std::vector<int> > arrays; 
arrays.reserve(numArrays); 

替换此线

std::vector<std::vector<int> > arrays(numArrays); 

和计算size() - 1之前添加用于非empty()岬测试。

+0

我仍然有点困惑。我该如何解决这个问题?我厌倦了删除该行,但仍然崩溃。 (我对C++非常陌生) –

+1

@ChristopherLittlewood更改此行'std:vector > arrays(numArrays);'对此'std:vector >数组;'。该程序将关闭,因为一个异常将从'std :: vector :: at()'抛出,并且顺便说一句,你没有试图捕获这样的异常。但我不相信你会需要。只要进行建议的更改,它应该可以工作。 – silvergasp

+0

@ChristopherLittlewood查看编辑答案。 –