我在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运行此程序时,我得到一个运行时错误,如下所示:
我检查了我的代码,以确保我没有引用不存在的元素,但无论我做什么,它都无法正常运行。发生了什么?为什么它不像在Xcode中那样在Visual Studio中运行?
答案 0 :(得分:1)
for (int j = randomOfRest; j < restaurvector.size(); j++)
{
restaurvector[j] = restaurvector[j + 1];
}
执行j + 1,意味着它将结束。
这将解决问题
for (int j = randomOfRest; j < restaurvector.size()-1; j++)
答案 1 :(得分:1)
restaurvector[j] = restaurvector[j + 1];
行上的代码失败,因为restaurvector[j + 1]
的{{1}}超出范围。
答案 2 :(得分:1)
问题是这个循环的最后一次迭代:
for (int j = randomOfRest; j < restaurvector.size(); j++)
{
restaurvector[j] = restaurvector[j + 1];
}
访问超出范围的项目(restaurvector[j + 1]
)。
但不是这样,为什么不删除项目randomOfRest
?
restaurvector.erase(restaurvector.begin() + randomOfRest);
擦除会将项目向上移动,因此您不需要循环来执行此操作。