Да, ORM влияют на производительность, зависит ли это в конечном итоге от специфики вашего проекта.
Программисты часто любят ORM, потому что им нравятся приятные интерфейсные среды для написания кода, такие как Visual Studio, и не нравится кодирование исходного SQL без интеллигентности и т. Д.
У ORM есть и другие ограничения, помимо снижения производительности - они также часто не выполняют то, что вам нужно, 100% времени, добавляют сложность дополнительного уровня абстракции, который должен поддерживаться и восстанавливаться каждый раз, когда производится изменение, Есть также проблемы с кэшированием.
Просто мысль - если бы поставщики баз данных сделали среду программирования SQL такой же приятной, как Visual Studio, и обеспечили бы более естественную связь между кодом db и внешним кодом, нам бы не понадобились ORM ... Я думаю, что со временем все может пойти в этом направлении.
В приведенном выше коде есть несколько проблем. Во-первых, 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);
Невозможно использовать итератор после удаления элемента, на который он ссылается.
Однако итераторы списков, которые ссылаются на неудаленные элементы после remove ()
должен оставаться в силе.
Поскольку итераторы зависят от длины структуры, остающейся неизменной, большинство итераторов не позволяют изменять список во время использования итератора. Если вы хотите пройти и изменить список, вам придется использовать цикл, независимый от итератора.