Сбой стабильности std :: remove и std :: remove_if?

Недавно (из одного комментария) я узнал, чтоstd::remove а такжеstd:remove_if стабильны Я ошибаюсь, считая, что это ужасный выбор дизайна, поскольку он предотвращает определенные оптимизации?

Представьте себе удаление первого и пятого элементов 1Мstd::vector, Из-за стабильности мы можемреализоватьremove со свопом. Вместо этого мы должны сдвинуть каждый оставшийся элемент. :(

Если бы мы не былиt, ограниченные стабильностью, мы могли бы (для RA и BD iter) практически иметь 2 iters, один спереди, второй сзади, а затем использовать своп, чтобы довести до конца подлежащие удалению элементы. Я'Я уверен, что умные люди могли бы быть даже лучше. Мой вопрос в целом, а не о конкретной оптимизации I 'Я говорю о.

РЕДАКТИРОВАТЬ: обратите внимание, что C ++ рекламирует принцип нулевых накладных расходов, а также естьstd::sort а такжеstd::stable_sort алгоритмы сортировки.

EDIT2: Оптимизация будет выглядеть примерно так:

За :remove_if

bad_iter с самого начала ищет те элементы, для которых предикат возвращает true.good_iter просматривает с конца те элементы, для которых предикат возвращает false.

когда оба нашли то, что ожидали, они обменяли свои элементы. Прекращение в.good_iter > n; for (int i =0; i < n; ++i) { string s = "123456"; s.push_back('a' + (rand() %26)); vsp.push_back(s); } auto vsp2 = vsp; auto remove_start = std::chrono::high_resolution_clock::now(); auto it=remove_if(begin(vsp),end(vsp), [](const string& s){ return s < "123456b";}); vsp.erase(it,vsp.end()); cout < vsp.size() < endl; auto remove_end = std::chrono::high_resolution_clock::now(); cout < "erase-remove: " < chrono::duration_cast

Ответы на вопрос(3)

Ваш ответ на вопрос