Итератор списка удаляет ()

Да, ORM влияют на производительность, зависит ли это в конечном итоге от специфики вашего проекта.

Программисты часто любят ORM, потому что им нравятся приятные интерфейсные среды для написания кода, такие как Visual Studio, и не нравится кодирование исходного SQL без интеллигентности и т. Д.

У ORM есть и другие ограничения, помимо снижения производительности - они также часто не выполняют то, что вам нужно, 100% времени, добавляют сложность дополнительного уровня абстракции, который должен поддерживаться и восстанавливаться каждый раз, когда производится изменение, Есть также проблемы с кэшированием.

Просто мысль - если бы поставщики баз данных сделали среду программирования SQL такой же приятной, как Visual Studio, и обеспечили бы более естественную связь между кодом db и внешним кодом, нам бы не понадобились ORM ... Я думаю, что со временем все может пойти в этом направлении.

14
задан Jim Ferrans 19 June 2009 в 05:16
поделиться

3 ответа

В приведенном выше коде есть несколько проблем. Во-первых, remove аннулирует любые итераторы, которые указывают на удаленные элементы. Затем вы продолжаете использовать итератор. Трудно сказать, какие элементы remove будут стираться в общем случае (хотя и не в вашем), так как он может удалить более одного.

Во-вторых, вы, вероятно, используете неправильный метод. Remove будет перебирать все элементы в списке в поисках любых совпадающих элементов - это будет неэффективно в вашем случае, потому что есть только один. Похоже, вам следует использовать метод erase , вы, вероятно, захотите стереть только элемент в позиции итератора. Функция erase хороша тем, что она возвращает итератор, который находится в следующей допустимой позиции. Идиоматический способ его использования выглядит примерно так:

//remove even numbers
for(itr = listA.begin(); itr != listA.end();)
{
    if ( *itr % 2 == 0 )
    {
        cout << *itr << endl;
        itr=listA.erase(itr);
    }
    else
      ++itr;
}

Наконец, вы также можете использовать remove_if , чтобы сделать то же самое, что и вы:

bool even(int i) { return i % 2 == 0; }

listA.remove_if(even);
44
ответ дан 1 December 2019 в 06:35
поделиться

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

Однако итераторы списков, которые ссылаются на неудаленные элементы после remove () должен оставаться в силе.

2
ответ дан 1 December 2019 в 06:35
поделиться

Поскольку итераторы зависят от длины структуры, остающейся неизменной, большинство итераторов не позволяют изменять список во время использования итератора. Если вы хотите пройти и изменить список, вам придется использовать цикл, независимый от итератора.

-1
ответ дан 1 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

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