Подтвердить что ты не робот

Удалить конечный элемент std:: set

Как удалить последний элемент из набора?

Например:

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

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

 setInt.erase(setInt.rbegin());

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

4b9b3361

Ответ 1

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

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

Ответ 2

в С++ 11

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

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

Ответ 3

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

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

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

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

Ответ 4

Если вы хотите удалить 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(); это O.K. Я читал. Таким образом, на - reegin(). Base() приводит к тому же результату, что и - end(). И оба должны работать.

Ответ 5

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

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