/home/tomek$ mkdir rpg
/home/tomek$ cd rpg
/home/tomek/rpg$ fetch http://penguinprogrammer.nfshost.com/data/rpg-tutorial.zip
rpg-tutorial.zip 100% of 19 kB 99 kBps 00m00s
/home/tomek/rpg$ unzip rpg-tutorial.zip
Archive: rpg-tutorial.zip
extracting: area.hpp
extracting: armour.hpp
extracting: atlas.cpp
extracting: atlas.hpp
extracting: battle.hpp
extracting: creature.hpp
extracting: dialogue.hpp
extracting: inventory.hpp
extracting: item.hpp
extracting: main.cpp
extracting: weapon.hpp
/home/tomek/rpg$ ls
area.hpp atlas.cpp battle.hpp dialogue.hpp item.hpp rpg-tutorial.zip
armour.hpp atlas.hpp creature.hpp inventory.hpp main.cpp weapon.hpp
/home/tomek/rpg$ clang++ -o swinka -std=c++11 *.cpp
/home/tomek/rpg$ ll swinka
-rwxr-xr-x 1 tomek wheel 168655 2 kwi 21:21 swinka*
/home/tomek/rpg$ uname -srm
FreeBSD 10.1-STABLE amd64
Tak sobie zerkam na ten kod:
// Remove the specified number of items from the inventory
void remove_item(Item* item, int count)
{
// Iterate through the items, and if they are found then decrease
// the quantity by the quantity removed
for(auto& it : this->items)
{
if(it.first == item) it.second -= count;
}
// Iterate through the list again, and remove any elements from
// the list that have zero or less for their quantity
// We do this in two passes because removing an element from
// a list during a for loop invalidates the iterators, and the
// loop stops working
this->items.remove_if([](std::pair<Item*, int>& element)
{
return element.second < 1;
});
}
Jeśli autor myśli że algorytm remove_if mu coś usunie to jest w błędzie. Remove_if służy do zgrupowania
elementów spełniających predykat na końcu kontenera, ale jeśli chcemy je fizycznie usunąć to należy jeszcze
użyć erase z iteratorem który zwróci właśnie remove_if.
Podobny błąd (błąd o ile rzeczywiście autor chce coś usuwać) jest w innych funkcjach.
Szkoda że autor wyłączył komentarze na swojej stronie.