gpt4 book ai didi

C++ - 混洗对象 vector

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:44 25 4
gpt4 key购买 nike

我正在尝试制作一副纸牌,我有一个纸牌对象 vector ,但是当我使用洗牌功能并打印纸牌时,它们的顺序与制作时的顺序相同。

这是我的扑克牌类:

#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);
}

我还尝试通过引用将我的 vector 传递到随机播放函数中,如下所示:

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

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

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

最佳答案

deck.reserve(deckSize);

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

deck.resize(deckSize);

事实上,最好完全删除 deckSize 变量,而只使用 deck.size()

关于C++ - 混洗对象 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47243057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com