C++ C++;-洗牌对象向量

C++ C++;-洗牌对象向量,c++,vector,C++,Vector,我试图制作一副牌,我有一个向量的牌对象,但当我使用我的洗牌功能和打印牌组时,他们都在相同的顺序,因为他们是当他们被制作 这是我的纸牌课: #include <iostream> #include <string> #include <random> #include <vector> #include <algorithm> using namespace std; class playingCards { private:

我试图制作一副牌,我有一个向量的牌对象,但当我使用我的洗牌功能和打印牌组时,他们都在相同的顺序,因为他们是当他们被制作

这是我的纸牌课:

#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);
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
班级玩牌{
私人:
结构卡{
炭服;
字符值;
};
const int deckSize=52;
向量甲板;
公众:
玩牌();
void printDeck();
无效洗牌();
};
playingCards::playingCards(){
甲板储备(甲板尺寸);
对于(int i=0;iprintDeck
函数都是未定义的行为。请改用
resize

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

deck.emplace_back(value)

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

对于第一个i值,您将得到setSuit的所有0,对吗?对于setValue,您将什么也得不到,因为deckSize是52。您可以直接访问向量deck为什么需要将其作为参数传递?将其更改为resize解决了问题,并且去掉deckSize也使其变得更简单,谢谢!我以同样的方式看到它。牌组大小应该是一个构造函数参数;这将使整个事情更加通用(例如,有不同的纸牌游戏子类),但您应该知道,
牌组。at(i)
(边界选中)比
牌组[i]
(未选中边界)慢得多.安全是要付出代价的…在这个小例子中并不重要,但如果您使用数千个字符串的数千次迭代,这将产生巨大的差异。因此,我可能会将“请勿使用”更改为“注意并仅在必要时使用”
deck.resize(deckSize);
deck.emplace_back(value)