为什么 std::bitset 不带有迭代器?

Why doesn't std::bitset come with iterators?

似乎 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 算法一起使用。
为什么委员会决定从 bitset 中排除迭代器?

我认为从来没有真正决定将迭代器从 bitset 中排除。

相反,bitset 是 类 之一,它早于将原始标准模板库添加到 C++ 标准的提案。在设计时,标准库的 none 本质上包含迭代器。

然后,建议添加 Stepanov 的库,并接受了其中的相当一部分。作为回应,对一些现有的 类(例如 std::string)进行了添加,以允许它们像新容器 类.

一样使用。

虽然这一切都发生在标准流程的后期——事实上,他们已经在一些地方改变了规则以添加他们所做的事情。除此之外,就在 containers/iterators/algorithms 被添加到库中的同时,委员会投票决定考虑标准 "feature complete",因此从那时起他们将只致力于修复错误等, 未添加新功能。

因此,即使已经编写了向 bitset 添加迭代器接口的提案,委员会唯一可以接受的方法是将其视为正在修复的错误,而不是正在添加的新功能。如果有一个非常可靠的提议,我想他们 可以 已经做到了,但我不认为有这样的提议,而且它会一直延伸这一点位,所以即使是一个非常好的提案也可能很容易被拒绝。

从那时起,就有一项提议 LEWG 1112,它会在 std::bitset 中添加一个迭代器接口。这是为 C++11 提出的,专门用于支持也在 C++11 中添加的 range-based for 循环。它遭遇了相当可耻的命运:它最初被接受,措辞被起草。然后看起来在语言中添加概念的提议会被接受,所以这个措辞被重写以使用闪亮、美妙的新概念。一段时间后,概念从语言中删除,而不是重新措辞提案使其不再依赖于概念,他们暂时将其标记为 "NAD Future",这意味着他们将其视为不是缺陷,并进一步推迟工作到未来的某个(不确定的)时间(据我所知,从那以后就没有再访问过它)。

您可以创建自己的迭代器,或者只使用 mine

用法如下:

#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, "