使用带有结构和指针的 temp

Posted

技术标签:

【中文标题】使用带有结构和指针的 temp【英文标题】:Using temp with structs and pointers 【发布时间】:2022-01-05 12:37:21 【问题描述】:
// 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 的数组进行洗牌。这是我的代码的一部分,由于某种原因,结果数组出现了许多值丢失,因为有些值是重复的。最后两行不应该只是交换值吗?

【问题讨论】:

【参考方案1】:

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;

【讨论】:

【参考方案2】:

在 C++ 中,如果不需要,则不应使用指针。 你知道 C++ 标准库带有一个 shuffle 函数吗? 通过使用它,您甚至不必自己实现交换功能, 并且您可以重复使用经过测试的代码。

您也可以使用 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;

【讨论】:

以上是关于使用带有结构和指针的 temp的主要内容,如果未能解决你的问题,请参考以下文章

C语言结构体中成员若是一个指针时的疑惑??

在一行中使用带有“temp”结构的向量 push_back(如果可能)

我写了一个程序,利用数组,结构体,函数,指针,实现按学生的年龄从大到小输出学生的姓名和年龄,代码如下

带有指针的C结构,如何Swig?

带有指针数组的 HDF5 结构

克隆链接列表会导致分段错误