Сет-лист в с ++
Я создал набор списков в C++ и заполнен элементами
std::set<Unit*> myUnits;
for(std::set<Unit*>::iterator i = myUnits.begin(); i != myUnits.end(); i++) {
if() {}
}
Так что я хочу, чтобы, если проверить каждый элемент setlist, что нужно вставить, если?
3 ответа
Unit* pUnit = *i;
даст вам указатель на Unit
объект. Кстати, правильным термином для контейнера является "set", а не "setlist".
Я не знаю точно, что вы хотите, но давайте предположим, что Unit
класс имеет bool Unit::check()
метод. Тогда вы должны написать:
if (i->check()) {...}
РЕДАКТИРОВАТЬ: Извините, я не понял, что у вас есть набор указателей... Я не уверен, что это то, что вы на самом деле хотите, потому что набор будет сравнивать адреса указателя, а не содержимое блока, чтобы определить, равны ли они. Вот небольшой пример кода, чтобы показать вам, как использовать набор с объектами Unit-и указателями на объекты Unit:
class Unit
{
public:
Unit(unsigned int id, bool c)
{
this->id = id; // should be unique
checked = c;
}
bool check() const
{
return checked;
}
unsigned int getId() const
{
return id;
}
bool operator<(const Unit &u) const // this is needed for the set<Unit>, otherwise two Units can't be compared
{
return this->id < u.id;
}
private:
bool checked;
unsigned int id;
};
void setTest()
{
set<Unit> myUnits;
Unit u1(1,true);
Unit u2(2,false);
Unit u3(2,true);
myUnits.insert(u1);
myUnits.insert(u2);
myUnits.insert(u3);
cout << "set<Unit>:" << endl;
for (std::set<Unit>::iterator it = myUnits.begin(); it != myUnits.end(); ++it)
{
if (it->check()) // you can access the Unit-object stored in the set like this...
{
cout << "Unit " << it->getId() << ": checked" << endl;
}
else
{
// ... or like this
Unit u = *it;
cout << "Unit " << u.getId() << ": check failed" << endl;
}
}
set<Unit*> myUnitPtrs;
myUnitPtrs.insert(&u1);
myUnitPtrs.insert(&u2);
myUnitPtrs.insert(&u3);
cout << "set<Unit*>:" << endl;
for (std::set<Unit*>::iterator it = myUnitPtrs.begin(); it != myUnitPtrs.end(); ++it)
{
if ((*it)->check()) // you can access a Unit-Pointer like this ...
{
cout << "Unit " << (*it)->getId() << ": checked" << endl;
}
else
{
Unit *u = *it; // ... or like this
cout << "Unit " << u->getId() << ": check failed" << endl;
}
}
}
Выход должен быть:
set<Unit>:
Unit 1: checked
Unit 2: check failed // inserting u3 doesn't change the set as a Unit with id 2 is already present in the set
set<Unit*>:
Unit 1: checked
Unit 2: check failed
Unit 2: checked // now there's two Units with id 2, because u2 and u3 have different adresses