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

Похоже, что std:: 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.
Почему комитет решил исключить итераторы из битрейта?

Ответы

Ответ 1

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

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

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

Все это происходило довольно поздно в процессе стандартизации, хотя на самом деле они уже согнули правила в нескольких местах, чтобы добавить то, что они сделали. Среди прочего, примерно в то же время, когда контейнеры/итераторы/алгоритмы были добавлены в библиотеку, комитет проголосовал за рассмотрение стандартной "функции законченной", поэтому с этого момента они будут работать только на исправление ошибок и т. не добавляя новые функции.

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

С тех пор было одно предложение LEWG 1112, которое добавило бы интерфейс итератора к std::bitset. Это было предложено для С++ 11 и было предложено специально для поддержки цикла на основе диапазона for, который также был добавлен в С++ 11. Она понесла довольно позорную судьбу: она была первоначально принята, и была составлена ​​формулировка. Тогда было похоже, что предложение о добавлении концепций на язык будет принято, поэтому эта формулировка была переписана для использования блестящих, замечательных новых концепций. Спустя некоторое время концепции были исключены из языка и вместо того, чтобы переформулировать предложение, чтобы оно больше не зависело от концепций, они условно обозначили его как "НАД-Будущее", что означает, что они рассматривали его как не являющийся дефектом и отложили дальнейшую работу пока некоторое (неопределенное) время в будущем (и, насколько я могу видеть, не пересматривал его с тех пор).

Ответ 2

Вы можете создать свой собственный итератор или просто использовать мой

Использование заключается в следующем:

#include <bitset>
#include "bitset_iterator.h"

std::bitset<32> indices{ 0b10101010101010101010101010101010 };

for (const auto& index : indices) {
  std::cout << index << ", ";
}
// Prints "1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, "