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

时间:2016-01-11 17:53:49

标签: c++ stl iterator 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";
}

相反,我必须:

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

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

2 个答案:

答案 0 :(得分:8)

我不认为实际上决定从bitset中排除迭代器。

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

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

这一切都发生在标准流程的后期 - 事实上,他们已经在一些地方修改了规则来添加他们所做的事情。除了其他方面,几乎与容器/迭代器/算法被添加到库中的同时,委员会投票决定考虑标准&#34;功能完整&#34;,所以从那时起他们只是#d;努力修复错误等,而不是添加新功能。

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

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

答案 1 :(得分:-1)

您可以创建自己的迭代器,也可以只使用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, "