Использование temp со структурами и указателями

#c #arrays #pointers #struct

#c #массивы #указатели #структура

Вопрос:

 // Store the original deck Card* temp = deck.Cards;  // For loop that iterates through array for (int i = 0; i lt; 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 lt; 52; i  ) {   int randomIndex = rand() % 52;  Card temp = deck.Cards[i];  deck.Cards[i] = deck.Cards[randomIndex];  deck.Cards[randomIndex] = temp; }  

Ответ №2:

В C вы не должны использовать указатели, если в этом нет необходимости. И знаете ли вы, что стандартная библиотека C поставляется с функцией перемешивания? Используя это, вам даже не нужно самостоятельно реализовывать функцию подкачки, и вы повторно используете проверенный код.

Вы также могли бы использовать std::swap().Карты[i], колода.Карты[Случайный индекс]);

 #include lt;algorithmgt; #include lt;arraygt; #include lt;iostreamgt; #include lt;randomgt;  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::arraylt;Card, 52gt;;  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 autoamp; card : deck) std::cout lt;lt; card.id() lt;lt; " ";  std::cout lt;lt; "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 autoamp; card : deck) std::cout lt;lt; card.id() lt;lt; " ";  std::cout lt;lt; "n";   return 0; }