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

Getting compiler error when trying to print out contents of vector

本文关键字:编译器 错误 打印      更新时间:2023-10-16

以下是迄今为止我所拥有的:

 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错误。。。

我想打印出矢量组中的内容,在阅读了一些内容后,我认为最好的选择是使用函数copy。你知道我该怎么解决这个问题吗?

像这样在main的顶部声明deck,这样它就不会声明超出范围

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(drawin[numvalue-1]),大约5%的时间都在访问drawin[-1]。更明智的做法是:

int numvalue = rand()%20 +1;

正如WhozCraig在下面指出的,您从未初始化draw,这将导致segfault。

您的deck是在调用副本时已完成的范围中定义的。在for循环开始之前,将deck的声明进一步上移,使其保持在作用域中。