Почему std :: bitset не поставляется с итераторами?

Похоже, что станд :: BitSet не поставляется с итераторами STL.
Поэтому я не могу сделать следующее:

std::bitset<8> bs;
for (auto it: bs) {
std::cout << "this can not be done out of the box\n";
}

Вместо этого я должен:

std::bitset<8> bs;
for (std::size_t i = 0; i < bs.size(); ++i) {
std::cout << bs[i] << '\n';
}

Без итераторов я также не могу использовать наборы битов ни с одним из алгоритмов STL.
Почему комитет решил исключить итераторов из набора?

20

Решение

Я не думаю, что когда-либо было реальное решение исключить итераторы из набора битов.

Скорее, bitset является одним из классов, предшествующих предложению о добавлении исходной стандартной библиотеки шаблонов в стандарт C ++. Когда это было разработано, по существу никто из стандартной библиотеки включены итераторы.

Затем библиотека Степанова была предложена для дополнения, и немало ее приняли. В ответ на это были добавлены некоторые существующие классы (например, std::string) чтобы их можно было использовать как новые классы контейнеров.

Хотя все это происходило довольно поздно в процессе разработки стандартов — фактически, они уже согнули правила в нескольких местах, чтобы добавить то, что они сделали. Помимо прочего, примерно в то же самое время, когда контейнеры / итераторы / алгоритмы были добавлены в библиотеку, комитет проголосовал за то, чтобы считать стандартную «полную функциональность», поэтому с этого момента они будут работать только над исправлением ошибок и тому подобного, не добавление новых функций.

Таким образом, даже если было написано предложение добавить интерфейс итератора в bitsetЕдинственным способом, которым комитет мог бы согласиться, было бы рассматривать это как исправление ошибки, а не добавление новой функции. Если бы было действительно солидное предложение, я полагаю, что они мог Я сделал это, но я не думаю, что было такое предложение, и оно могло бы немного растянуть смысл, так что даже действительно хорошее предложение могло бы быть легко отклонено.

С тех пор было одно предложение, LEWG 1112, который бы добавил интерфейс итератора std::bitset, Это было предложено для C ++ 11, и было предложено специально для поддержки основанного на диапазоне for цикл, который также был добавлен в C ++ 11. Его постигла довольно позорная участь: он был первоначально принят, и формулировка была составлена. Тогда казалось, что предложение о добавлении концепций в язык будет принято, поэтому эта формулировка была переписана с использованием блестящих, замечательных новых концепций. Некоторое время спустя концепции были удалены из языка, и вместо того, чтобы переписать предложение, чтобы оно больше не зависело от концепций, они предварительно пометили его как «NAD Future», что означает, что они рассматривали его как не являющийся дефектом, и отложили дальнейшую работу. до некоторого (неопределенного) времени в будущем (и, насколько я вижу, с тех пор не пересматривал его).

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]