我正在尝试制作一副纸牌,我有一个卡片对象的矢量,但是当我使用我的随机播放功能并打印卡片时,它们的制作顺序与它们制作时的顺序相同。
这是我的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);
}
这也没有用。任何帮助将不胜感激,我是使用矢量的新手,所以我真的不明白这里可能会发生什么。
答案 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].