37

似乎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 中排除迭代器?

4

2 回答 2

17

我认为从未有过将迭代器从位集中排除的实际决定。

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

然后,有人提出要添加 Stepanov 的库,并且其中相当一部分被接受了。作为对此的回应,对一些现有的类(例如std::string)进行了添加,以允许它们像新的容器类一样使用。

这一切都发生在标准过程的后期——事实上,他们已经在一些地方改变了规则来添加他们所做的事情。除其他事项外,几乎在将容器/迭代器/算法添加到库中的同时,委员会投票考虑标准“功能完整”,因此从那时起他们只致力于修复错误等,不添加新功能。

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

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

于 2016-01-11T18:26:39.287 回答
0

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

用法如下:

#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, "
于 2019-01-24T08:15:24.180 回答