簡體   English   中英

使用帶有結構和指針的 temp

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM