[英]Using temp with structs and pointers
// Store the original deck
Card* temp = deck.Cards;
// For loop that iterates through array
for (int i = 0; i < 52; i++) {
int randomIndex = rand() % 52;
deck.Cards[i] = deck.Cards[randomIndex];
deck.Cards[randomIndex] = temp[i];
}
我想打亂一個我已經創建的大小為 52 的數組。這是我的代碼的一部分,由於某種原因,結果數組出現了許多值丟失,因為有些是重復的。 最后兩行不應該只是交換值嗎?
temp
是指向同一數組的另一個指針 - 卡片不會重復,因此當您在循環體的原始數組中覆蓋卡片時,相同的更改也將通過temp
“可見”。
切換數組中的元素的最佳做法是為被切換的元素使用臨時變量。 例如:
// For loop that iterates through array
for (int i = 0; i < 52; i++) {
int randomIndex = rand() % 52;
Card temp = deck.Cards[i];
deck.Cards[i] = deck.Cards[randomIndex];
deck.Cards[randomIndex] = temp;
}
在 C++ 中,如果不需要,則不應使用指針。 您知道 C++ 標准庫帶有隨機播放 function 嗎? 通過使用它,您甚至不必自己實現交換 function,並且您可以重用經過測試的代碼。
您也可以使用 std::swap(deck.Cards[i], deck.Cards[randomIndex]);
#include <algorithm>
#include <array>
#include <iostream>
#include <random>
class Card
{
public:
Card() :
m_id{ g_id++ }
{
};
std::size_t id() const
{
return m_id;
}
private:
std::size_t m_id;
static std::size_t g_id;
};
// to generate a new instance id for each Card
std::size_t Card::g_id{ 0 };
// or make a Cards member in Deck that is a std::array
// this is just a short version to show you the direction.
using Deck = std::array<Card, 52>;
int main()
{
// random generator stuff C++ style
std::random_device rd{};
std::default_random_engine random_generator{ rd() };
// a deck
Deck deck;
// show start order of cards
for (const auto& card : deck) std::cout << card.id() << " ";
std::cout << "\n";
// shuffle the cards
// https://en.cppreference.com/w/cpp/algorithm/shuffle
std::shuffle(deck.begin(), deck.end(), random_generator);
// show shuffled order of the cards
for (const auto& card : deck) std::cout << card.id() << " ";
std::cout << "\n";
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.