Помогите мне разобраться в std :: erase - PullRequest
2 голосов
/ 30 ноября 2009

В книге «C ++ в двух словах» приведен следующий пример кода

std::vector<int> data
...
std::erase(std::remove(data.begin(), data.end(), 42),
  data.end());

Я думал, что «стирание» - это функция-член, поэтому не должно ли это быть «data.erase», а не «std :: erase»? Есть ли какой-то способ, которым компилятор c ++ может сказать, к какому члену вы хотите вызвать функцию-член, или в книге пропущена какая-либо документация по функции шаблона стирания, или пример неверен?

Ответы [ 6 ]

13 голосов
/ 30 ноября 2009

erase является функцией-членом. Образец указан неверно.

7 голосов
/ 30 ноября 2009

Нет std::erase. std::map::erase, std::list::erase существует. Но std::erase не существует.

Смотри этот вопрос о фантомном std :: erase.

3 голосов
/ 30 ноября 2009

Ваше наблюдение верно. «Стереть» должен быть функцией-членом. Только функция-член в контейнере может изменить размер памяти этого контейнера.

3 голосов
/ 30 ноября 2009

Да, стирание является функцией-членом, поэтому оно должно быть data.erase() вместо std::erase().

0 голосов
/ 01 декабря 2009

Существует алгоритм под названием std :: remove. И вызов стереть на структуру данных. remove перемещает все элементы, которые будут удалены, в конец диапазона итератора и возвращает первый элемент, который будет удален. Возвращает end (), если элемент не может быть найден.

Итак, вы вызываете стирание по диапазону, начиная с возвращаемого значения std :: remove и заканчивая структурой данных.

См .: http://www.sgi.com/tech/stl/remove.html

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

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

std::vector<int> data
...
data.erase(std::remove(data.begin(), data.end(), 42), data.end())

по сравнению с чем-то вроде этого, которое является O (N ** 2)

std::vector<int> data
...
for ( i = data.begin(), i != data.end(); ++i ) {
  if ( *i == 42 ) data.erase( i ) ;
}
0 голосов
/ 30 ноября 2009

Редактировать: Извините, это не общее стирание, просто дважды проверено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...