Как отмечает @Eljay, вы пытаетесь получить доступ к элементам после конца массивов. Если бы вы использовали отладчик для пошагового выполнения вашей программы, вы бы увидели это.
Однако, это также урок для вас, чтобы быть осторожным в написании сырых циклов, с большим индексов "magi c -number" и предпочитают использовать ранее существующие шаблоны из библиотек (особенно std :: алгоритма), когда это уместно. См. этот разговор Шона Родителя об этом общем принципе.
В частности, вы могли бы написать свою программу следующим образом:
#include <range/v3/view.hpp>
#include <string>
#include <array>
#include <iostream>
struct card {
std::string suite;
std::string value;
};
std::ostream& operator<<(std::ostream& os, const card& c)
{
return os << c.value << " of " << c.suite;
}
int main()
{
using namespace ranges;
std::array suites {"Spades","Hearts","Diamonds","Clubs"};
std::array values {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
auto cards =
views::cartesian_product(suites, values) |
views::transform([](const auto& suite_and_value) -> card {
return { std::get<0>(suite_and_value), std::get<1>(suite_and_value) };
});
auto num_players { 2 };
auto player1_cards =
cards | views::stride(num_players);
auto player2_cards =
cards | views::drop(1) | views::stride(num_players);
std::cout << "Player 1 got: " << player1_cards << '\n';
std::cout << "Player 2 got: " << player2_cards << '\n';
}
, в этом случае вы этого не сделаете используйте любые петли и любые индексные переменные. Для этого используется библиотека Eri c Niebler range-v3 . См. Также этот краткий справочник , чтобы быстрее понять, что происходит в этом коде, если вы не знакомы с терминами.
См. Live on GodBolt .