Селектор CSS « General Sibling Combinator » может быть использован для того, что вы хотите:
E ~ F {
property: value;
}
Это соответствует любому элементу F
, которому предшествует E
].
В Player::menu
у вас есть петля, for(auto& p : ItemsList)
. В этом цикле вы вызываете последовательность (useItem(item)
-> ItemAttributes(itemID)
-> removeItem(id)
-> ItemsList.erase(itr)
), которая может изменить карту ItemsList
, через которую вы перебираете. Это делает недействительными итераторы, в настоящее время ссылающиеся на p
, поэтому при попытке получить доступ к следующему элементу на карте вы получите неопределенное поведение, потому что (используемый внутри) итератор больше не действителен.
Одним из возможных способов решения этой проблемы является изменение цикла for
для использования собственных итераторов и увеличение итератора в верхней части тела цикла (перед изменением карты):
for (auto it = ItemsList.begin(); it != ItemsList.end(); ) {
auto &p = *it;
++it;
// rest of for loop
}