Удалить конечный элемент std:: set
Как удалить последний элемент из набора?
Например:
set<int> setInt;
setInt.insert(1);
setInt.insert(4);
setInt.insert(3);
setInt.insert(2);
Как удалить 4
из setInt
? Я попробовал что-то вроде:
setInt.erase(setInt.rbegin());
но я получил ошибку.
Ответы
Ответ 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);
}
}