2013-04-05 3 views
1
class SororityBeerExpo{ 
public: 

    std::list<LaysCrankdPepChip> m_chipList; 

    void destroyChip(LaysCrankdPepChip * target) 
    { 
     // m_chipList needs to erase that which is pointed at by target but 
     // erase() requires an iterator which is not what we got to work with 
     // remove() needs a value which is not right either 
    } 
} 

Вопрос: как удалить элемент в списке с указателем, указывающим на этот элемент? Я хотел бы сделать это, не используя Итераторы вместо указателей.Удалить элемент из std :: list с помощью указателя?

+0

Единственный способ AFAIK - линейный поиск, пока вы не найдете указатель. Просто используйте итераторы. – Pubby

ответ

3

Вы можете выполнить [линейный] поиск элемента в списке, сравнивая адрес каждого элемента с указателем (std::find_if подходит для счета). Конечно, вы все равно будете использовать итератор в конце, потому что это то, что нужно list::erase.

+0

Вы можете использовать [remove_if] (http://en.cppreference.com/w/cpp/container/list/remove), который устранит вызов 'erase'. –

+0

@JesseGood: Верно. Но это приведет к излишнему поиску всех элементов, даже если вы найдете матч на ранней стадии. –

+0

Ах, хорошая точка. +1 –

1

Вы не можете сделать это напрямую (хотя см. Ответ Бенджамина для косвенного способа сделать это). Узел списка содержит больше данных, чем только содержащий объект (например, указатели на предыдущий и следующий узлы), но ваш необработанный указатель указывает только на содержащийся объект.