这是我到目前为止所拥有的:
int main(int argc, char const *argv[])
{
srand(time(NULL));
vector<int> deck;
vector<bool> drawn;
for (int i = 0; i < 20; i++)
{
int numvalue = rand()%20;
if (drawn[numvalue - 1]) // this checks if their are duplicate values
{
i--;
continue;
}
else
{
drawn[numvalue - 1] = true;
//vector<int> deck;
deck.push_back(numvalue);
}
}
copy (deck.begin(), deck.end(), ostream_iterator<int>(cout, " "));
return 0;
}
我得到的编译器错误是:
编辑:解决了编译问题,但现在这是seg faulting ......
我想打印出矢量卡片里面的内容,在做了一些阅读之后,我认为最好的选择是使用功能副本。我有什么想法可以解决这个问题吗?
答案 0 :(得分:3)
在这样的主要顶部声明牌组,所以它没有宣布超出范围
int main(int argc, char const *argv[])
{
srand(time(NULL));
vector<int> deck;
vector<bool> drawn(20);
for (int i = 0; i < 20; i++)
{
int numvalue = rand()%20;
if (drawn[numvalue - 1])
{
i--;
continue;
}
else
{
drawn[numvalue - 1] = true;
deck.push_back(numvalue);
}
}
copy (deck.begin(), deck.end(), ostream_iterator<int>(cout, " "));
return 0;
}
另外
int numvalue = rand()%20;
可以轻松返回0,并且使用if(绘制[numvalue - 1]),您可以在大约5%的时间内访问绘制的[-1]。更聪明的做法是将其改为:
int numvalue = rand()%20 +1;
正如WhozCraig在下面指出的那样,你从未初始化绘制,这将导致段错误。
答案 1 :(得分:2)
您的套牌正在一个范围内定义,该范围在调用副本时已完成。在for循环开始之前进一步向上移动deck声明,使其保持在范围内。