2015-04-02 49 views
0

我正在学习在Xcode中花费最后一个学期编码后使用Visual Studio。我写了一个简单的函数来洗牌持有家餐馆中字符串不同的名称如下矢量:矢量下标超出范围错误的可能原因是什么?

#include <vector> 
#include <string> 
#include <ctime> 

//shuffles all the restaurants 
void shuffler(vector<string>& restaurvector) 
{ 
    srand(time(NULL)); 
    vector<string> shuffled; 
    long initialSize = restaurvector.size(); 
    for (int i = 0; i < initialSize; i++) 
    { 
     // get a random number between 0 and the current vector size 
     int randomOfRest = rand() % restaurvector.size(); 
     // locate a random element in the original vector and set it as 
     // the next element in the shuffled vector 
     shuffled.push_back(restaurvector[randomOfRest]); 
     // delete the element that was copied and shift remaining elements 
     for (int j = randomOfRest; j < restaurvector.size(); j++) 
     { 
      restaurvector[j] = restaurvector[j + 1]; 
     } 
     restaurvector.pop_back(); 
    } 
    restaurvector = shuffled; 
    cout << "\nThe restaurant vector has been shuffled.\n"; 
} 

当我运行在Xcode此相同的程序,它编译和运行完美。当我运行从Visual Studio这个程序,我得到的是这样的一个运行时错误:

enter image description here

我检查了我的代码,使不存在的不确定我是不是引用的元素,但无论是什么我这样做,它运行不正常。发生了什么?为什么它不像在Xcode中那样在Visual Studio中运行?

+0

'restaurvector.size() - 1'超出范围时'restaurvector [j + 1]'。 – Matt 2015-04-02 00:49:11

回答

1
for (int j = randomOfRest; j < restaurvector.size(); j++) 

    { 
     restaurvector[j] = restaurvector[j + 1]; 
    } 

确实j + 1,这意味着它会结束。

这将解决就行了restaurvector[j] = restaurvector[j + 1];代码失败,因为在restaurvector[j + 1]j = restaurvector.size()-1出界的问题

for (int j = randomOfRest; j < restaurvector.size()-1; j++) 
+0

所以,如果我改变它'restaurvector [j - 1] = restaurvector [j]'会解决它吗? – brandaemon 2015-04-02 00:54:53

+0

如果你这样做,如果randomOfRest为0,则会导致问题 – 2015-04-02 00:55:52

+0

确定了。我会在六分钟内接受你的回答。任何想法为什么Xcode允许这个错误,工作正常,但Visual Studio没有?这是真正的问题。 – brandaemon 2015-04-02 00:57:00

1

的问题是,这个循环的最后一次迭代:

for (int j = randomOfRest; j < restaurvector.size(); j++) 
{ 
    restaurvector[j] = restaurvector[j + 1]; 
} 

访问某个项目时出界(restaurvector[j + 1])。

但是,不是这样,为什么不只是删除项目randomOfRest

restaurvector.erase(restaurvector.begin() + randomOfRest); 

擦除将向上移动项目,所以你不需要循环来做到这一点。

+0

我宁愿只是删除这样的项目,但对于我们的初学者C++类,我们需要使用循环来清除向量中的项目。尽管如此,我会为未来记住这一点。 – brandaemon 2015-04-02 01:04:47

+0

@Brandon为什么不只是说“我查了什么矢量,我看到了擦除功能做的工作”?你为什么会因研究而受到惩罚?这应该受到赞扬。 – PaulMcKenzie 2015-04-02 01:06:50

+0

他们希望我们练习使用循环。这是一个非常基础的初级班。大多数学生在之后可能不会参加任何其他编程课程。我同意 - 如果它更简单,更实用,我们应该被允许使用它。就像我想在Xcode而不是Visual Studio中完成我们的最终项目一样。 – brandaemon 2015-04-02 01:08:33