cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

метод clear() в std::queue, std::stack и std::priority_queue #344

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +20, -1 Автор идеи: Osmironov

На сегодняшний день для полной очистки, например std::queue необходимо писать что-то вроде:

std::queue<int> q;

// заполнение queue

while ( !q.emty() ) {
    q.pop();
}

// дальнейший код

В то же время, в нижележащем std::deque присутствует метод clear(), но к нему нет доступа.

Предлагаю сделать метод clear() который будет вызывать clear() нижележащего контейнера.

apolukhin commented 3 years ago

yndx-antoshkka, 27 августа 2018, 11:27 Стоит обратить внимание на граничные случаи. Как вести себя если пользователь использует один из адаптеров со своим контейнером, у которого нет clear(). Запрещать вызывать clear() для адаптера на этапе компиляции, или реализоввывать его в этом случае через

while ( !q.emty() ) {
    q.pop();
}

?

Osmironov, 27 августа 2018, 20:09 yndx-antoshkka, ну более медленного варианта чем

while ( !q.emty() ) {
    q.pop();
}

сложно придумать. В то же время, вызов clrear() нижнего уровня значительно ускорит процесс. Хуже точно не должно стать.

yndx-antoshkka, 31 августа 2018, 13:49 Osmironov, вообще можно реализовать fallback более разумно:

void clear() {

    if constexpr (__has_memeber_clear(Container) ) {

        c.clear();

    } else {

        c = Container();

    }
}

Попробуйте написать черновик предложения, следуя инструкции https://stdcpp.ru/podgotovka-predlozheniya-v-standart-c-instruktsiya . Шероховатости подправим.

Osmironov, 31 августа 2018, 19:30 yndx-antoshkka, Хорошо, посмотрю что смогу сделать

Андрей Руссков, 28 сентября 2018, 0:26 yndx-antoshkka, а если для моего контейнера деструктор будет выполнять

for (; !queue.empty(); queue.pop());

и освобождать память, а конструктор пустого контейнера - выделять память?

Anton Bikineev, 27 августа 2018, 15:46 Это частный случае более общей проблемы доставания underlying контейнера из адаптера. Две распространенных практики в этом случае:

1) не использовать адаптер вообще :)

2) наследоваться от него. Я подозреваю, поэтому он и был сделан как protected член.

Касательно clear, мне нравится ответ отсюда: "since the "abstract" spec of the corresponding data structure (from some book on abstract algorithms and data structures) does not include operation clear for canonical priority queues or stacks, it is not provided in the adaptor."

Можно подобрать набор юзкейзов из практической жизни и написать пропозал, убедив комитет в необходимости расширить минимальный интерфейс адаптеров.

Саша Зайцев, 27 августа 2018, 23:33 Anton Bikineev, честно говоря, звучит как слабая отговорочка. Лично мне бы хотелось иметь методы clear() у std::queue и подобных

neondev9, 16 ноября 2018, 16:44 Еще бы reserve не помешал бы.

Все равно выбор контейнера ограничен std::vector и std::deque

apolukhin commented 3 years ago

Похожая идея в #61 , но там меньше описание, так что закрою #61 как дубликат.