Стереть последний член std :: set - PullRequest
23 голосов
/ 13 декабря 2011

Как я могу удалить последнего участника из набора?

Например:

set<int> setInt;
setInt.insert(1);
setInt.insert(4);
setInt.insert(3);
setInt.insert(2);

Как я могу удалить 4 из setInt? Я пробовал что-то вроде:

 setInt.erase(setInt.rbegin());

но я получил ошибку.

Ответы [ 6 ]

34 голосов
/ 13 декабря 2011

в C ++ 11

setInt.erase(std::prev(setInt.end()));

Вы можете решить, как вы хотите обрабатывать случаи, когда набор пуст.

18 голосов
/ 13 декабря 2011
if (!setInt.empty()) {
    std::set<int>::iterator it = setInt.end();
    --it;
    setInt.erase(it);
}

Кстати, если вы делаете это много (добавляя вещи в набор в произвольном порядке и затем удаляя верхний элемент), вы также можете взглянуть на std::priority_queue, посмотреть, подходит ли этоваше использование.

6 голосов
/ 14 декабря 2011

Я бы предложил использовать другое имя для rbegin, которое имеет правильный тип:

setInt.erase(--setInt.end());

Предполагается, что вы проверили, что setInt не пусто!

Кстати.это работает, потому что вы можете вызывать мутирующий оператор декремента временно (типа std::set<int>::iterator).Затем этот временный код будет передан в функцию стирания.

4 голосов
/ 05 апреля 2018

Чуть менее производительный, но альтернативный вариант:

setInt.erase(*setInt.rbegin());
1 голос
/ 13 декабря 2011

Если вы хотите удалить 4 вместо последнего, используйте метод find. В зависимости от варианта использования 4 может быть не последним.

std::set<int>::iterator it = setInt.find(4);
if(it != setInt.end()) {
  setInt.erase(it);
} 

Если вы хотите удалить последний элемент, используйте:

if (!setInt.empty()) {
  setInt.erase(--setInt.rbegin().base());
  // line above is equal to 
  // setInt.erase(--setInt.end());
}

Пока я не был уверен, если - *. End (); это О.К. Я немного почитал. Таким образом, - on rbegin (). Base () приводит к тому же результату, что и - end (). И оба должны работать.

0 голосов
/ 14 декабря 2011

Проверьте, пусто ли устройство или нет. Если нет, то получите последний элемент и установите его в качестве итератора, уменьшите этот итератор и сотрите последний элемент.

if (!setInt.empty())
 {
    std::set<int>::iterator it = setInt.end();
    --it;
    if(it != setInt.end()) {
    setInt.erase(it);
    } 
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...