尝试打印向量内容时出现编译器错误

时间:2014-04-16 04:30:42

标签: c++ vector

这是我到目前为止所拥有的:

 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 ......

我想打印出矢量卡片里面的内容,在做了一些阅读之后,我认为最好的选择是使用功能副本。我有什么想法可以解决这个问题吗?

2 个答案:

答案 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声明,使其保持在范围内。