使用带有结构和指针的 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的主要内容,如果未能解决你的问题,请参考以下文章
在一行中使用带有“temp”结构的向量 push_back(如果可能)