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

Osmironov
Osmironov

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

std::queue<int> q;

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

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

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

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

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

8
рейтинг
6 комментариев
yndx-antoshkka

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

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

?

yndx-antoshkka
Osmironov

yndx-antoshkka, ну более медленного варианта чем

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

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

Osmironov
yndx-antoshkka

Osmironov, вообще можно реализовать fallback более разумно:

void clear() {

    if constexpr (__has_memeber_clear(Container) ) {

        c.clear();

    } else {

        c = Container();

    }

}

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

yndx-antoshkka
Osmironov

yndx-antoshkka, Хорошо, посмотрю что смогу сделать

Osmironov
Anton Bikineev

Это частный случае более общей проблемы доставания 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."

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

Anton Bikineev
Саша Зайцев

Anton Bikineev, честно говоря, звучит как слабая отговорочка. Лично мне бы хотелось иметь методы clear() у std::queue и подобных

Саша Зайцев
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения