为什么std :: bitset没有迭代器?

Tre*_*key 24 c++ iterator stl bitset 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";
}
Run Code Online (Sandbox Code Playgroud)

相反,我必须:

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

没有迭代器,我也不能将bitset与任何STL算法一起使用.
为什么委员会决定从bitset中排除迭代器?

Jer*_*fin 10

我认为没有任何实际决定从bitset中排除迭代器.

相反,bitset是提议将原始标准模板库添加到C++标准之前的类之一.在设计时,基本上没有一个标准库包含迭代器.

然后,Stepanov的图书馆被提议添加,并且相当多的它被接受了.作为对此的响应,增加了一些现有的类(例如std::string),以允许它们像新的容器类一样被使用.

这一切都发生在标准流程的相当晚期 - 事实上,他们已经在几个地方修改了规则来添加他们所做的事情.除了其他的东西,几乎与容器/迭代器/算法被添加到库中的同时,委员会投票决定考虑标准的"功能完整",所以从那时起他们只会修复错误等等,没有添加新功能.

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

从那以后,有一个提议,即LEWG 1112,它将添加一个迭代器接口std::bitset.这是为C++ 11提出的,并且专门用于支持for在C++ 11中添加的基于范围的循环.它遭受了相当可耻的命运:它最初被接受,起草了措辞.然后,似乎可以接受将语言添加到语言中的提议,因此这些措辞被重写以使用闪亮的,精彩的新概念.一段时间后,概念被从语言中删除,而不是重新提交提案,使其不再依赖于概念,他们暂时将其标记为"NAD Future",这意味着他们将其视为不是缺陷,并推迟任何进一步的工作直到将来某个(无限期)时间(据我所知,从那时起就没有重新审视过).

  • @RexYuan:至少据我所知,它仍然没有迭代器支持。 (3认同)
  • 同样重要的是要注意,在委员会允许代理迭代器成为真正的迭代器之前,它们不能是正确的迭代器.大多数算法都允许假设从`*it`返回的内容是对真正的`iterator :: value_type`的真实引用,而不是可能是代理对象. (2认同)
  • 现在已经2021年了!我们有概念!去去去 `std::bitset&lt;N&gt;::iterator`! (2认同)