Позвольте мне сначала уйти от темы. Ваш дизайн немного подозрительный. Первый переход в CardDeck по значению почти наверняка не то, что вы хотите, но это даже не относится к делу. Почему в вашем классе Player должно быть все это внутреннее знание о частных внутренностях CardDeck. Не должно заботиться о том, чтобы вы хранили колоду как вектор или деку (ха-ха), или какова структура. Это просто не должно знать это. Все, что он знает, это то, что он хочет сбросить карту.
masterDeck.Discard (selectedCard);
Также обратите внимание, что selectedCard должен быть между 0 и ONE LESS размера колоды, но даже это, вероятно, не ваша проблема (хотя это будет 1/53 времени)
Итак, чтобы ответить на ваш вопрос, нам действительно нужно немного подробнее рассказать о masterDeck. Вы реализовали правильный пользовательский конструктор копирования? Поскольку вы передаете по значению шансов, вы не правильно копируете базовый вектор, на самом деле он, вероятно, пуст и ни одно из удалений не будет работать. Попробуйте проверить размер. Если вы никогда не хотите, чтобы колода была скопирована, вы можете позволить компилятору помочь вам, объявив конструктор частной копии, а затем никогда не определяя его. См. Эффективный C ++ Скотта Мейера, пункт 11.
Наконец, последний совет, я полагаю, что после того, как вы удалите его с помощью итератора, вы сделаете его недействительным. Вектор может быть перераспределен (почти наверняка, если вы удалите его где-нибудь, кроме конца). Я просто говорю вам, чтобы вы не пытались вызвать стирание более одного раза на одном итераторе. Одна из хитростей в итераторах заключается в том, насколько легко их можно аннулировать, поэтому вы часто видели проверки на iter! = Coll.end ().