Можете Вы удалять элементы из станд.:: перечислить при итерации через него?

Вы не можете вызвать конструктор, как если бы это был обычный метод, вы можете вызвать его только с помощью new, чтобы создать новый объект:

Kid newKid = new Kid(this.name, this.height, this.bDay);

Но построение нового объекта из вашего Метод toString () - это не то, что вы хотите делать.

232
задан AShelly 27 February 2009 в 19:08
поделиться

5 ответов

Необходимо увеличить итератор сначала (со мной ++) и затем удалять предыдущий элемент (например, при помощи возвращенного значения от меня ++). Можно изменить код на некоторое время цикл как так:

std::list<item*>::iterator i = items.begin();
while (i != items.end())
{
    bool isActive = (*i)->update();
    if (!isActive)
    {
        items.erase(i++);  // alternatively, i = items.erase(i);
    }
    else
    {
        other_code_involving(*i);
        ++i;
    }
}
271
ответ дан Michael Kristofik 4 November 2019 в 13:10
поделиться

Необходимо сделать комбинацию ответа Kristo и MSN:

// Note: Using the pre-increment operator is preferred for iterators because
//       there can be a performance gain.
//
// Note: As long as you are iterating from beginning to end, without inserting
//       along the way you can safely save end once; otherwise get it at the
//       top of each loop.

std::list< item * >::iterator iter = items.begin();
std::list< item * >::iterator end  = items.end();

while (iter != end)
{
    item * pItem = *iter;

    if (pItem->update() == true)
    {
        other_code_involving(pItem);
        ++iter;
    }
    else
    {
        // BTW, who is deleting pItem, a.k.a. (*iter)?
        iter = items.erase(iter);
    }
}

, Конечно, самое эффективное и SuperCool® STL savy вещь был бы чем-то вроде этого:

// This implementation of update executes other_code_involving(Item *) if
// this instance needs updating.
//
// This method returns true if this still needs future updates.
//
bool Item::update(void)
{
    if (m_needsUpdates == true)
    {
        m_needsUpdates = other_code_involving(this);
    }

    return (m_needsUpdates);
}

// This call does everything the previous loop did!!! (Including the fact
// that it isn't deleting the items that are erased!)
items.remove_if(std::not1(std::mem_fun(&Item::update)));
21
ответ дан Mike 4 November 2019 в 13:10
поделиться

Вы хотите сделать:

i= items.erase(i);

, Который правильно обновит итератор для указания на местоположение после итератора, который Вы удалили.

125
ответ дан MSN 4 November 2019 в 13:10
поделиться

Станд. использования:: алгоритм remove_if.

Редактирование: Работа с наборами должна быть похожей: 1. подготовьте набор. 2. набор процесса.

Жизнь будет легче, если Вы не смешаетесь, это ступает.

  1. станд.:: remove_if. или список:: remove_if (если Вы знаете, что работаете со списком а не с TCollection)
  2. станд.:: for_each
10
ответ дан Mykola Golubyev 4 November 2019 в 13:10
поделиться

Удаление делает недействительным только итераторы, которые указывают на элементы, которые удалены.

Так в этом случае после удаления *я, я делаюсь недействительным, и Вы не можете сделать инкремента на нем.

то, Что можно сделать, является первым сохранением итератор элемента, который должен быть удален, затем увеличить итератор и затем удалять сохраненный.

2
ответ дан anand 4 November 2019 в 13:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: