C ++ - 改组对象向量

时间:2017-11-11 21:39:34

标签: c++ vector

我正在尝试制作一副纸牌,我有一个卡片对象的矢量,但是当我使用我的随机播放功能并打印卡片时,它们的制作顺序与它们制作时的顺序相同。

这是我的playCards课程:

#include <iostream>
#include <string>
#include <random>
#include <vector>
#include <algorithm>

using namespace std;

class playingCards {
private:
    struct card {
        char suit;
        char value;
    };

    const int deckSize = 52;
    vector<card> deck;

public:
    playingCards();
    void printDeck();
    void shuffle();
};

playingCards::playingCards() {
    deck.reserve(deckSize);

    for (int i = 0; i < deckSize; i++) {
        int setSuit = i % 4;

        if      (setSuit == 0) deck[i].suit = 'D';
        else if (setSuit == 1) deck[i].suit = 'H';
        else if (setSuit == 2) deck[i].suit = 'S';
        else if (setSuit == 3) deck[i].suit = 'C';

        int setValue = i % 13;

        if      (setValue == 0)  deck[i].value = 'A';
        else if (setValue == 9)  deck[i].value = 'T';
        else if (setValue == 10) deck[i].value = 'J';
        else if (setValue == 11) deck[i].value = 'Q';
        else if (setValue == 12) deck[i].value = 'K';
        else                     deck[i].value = '0' + (setValue + 1);
    }
}

void playingCards::printDeck() {
    for (int i = 0; i < deckSize; i++) {
        cout << deck[i].value << deck[i].suit << endl;
    }
}

void playingCards::shuffle() {
    auto rng = default_random_engine {};

    std::shuffle(begin(deck), end(deck), rng);
}

我还尝试通过引用我的向量传递给shuffle函数,如下所示:

void playingCards::shuffle(vector<card>& deck) {
    auto rng = default_random_engine {};

    std::shuffle(begin(deck), end(deck), rng);
}

这也没有用。任何帮助将不胜感激,我是使用矢量的新手,所以我真的不明白这里可能会发生什么。

2 个答案:

答案 0 :(得分:3)

deck.reserve(deckSize);

这不会向您的向量添加任何元素,它只为它们保留空间。所以你的矢量大小为零,当你洗牌时,没有任何反应。构造函数的其余部分(设置(不存在的)向量元素)以及printDeck函数都是未定义的行为。请改用resize

deck.resize(deckSize);

事实上,最好只删除deckSize变量,然后使用deck.size()

答案 1 :(得分:3)

你必须使用

deck.emplace_back(value)

为了创建实际的矢量。您只保留了未实例化矢量的已分配内存。请注意使用deck[i],这可能会导致未定义的行为,而是使用deck.at(i)。对于此特定问题,请使用deck.emplace_back(value)代替deck[i].