web-dev-qa-db-ja.com

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アルゴリズムでもビットセットを使用できません。
委員会がイテレータをビットセットから除外することにしたのはなぜですか?

27
Trevor Hickey

イテレータをビットセットから除外するという実際の決定があったことはないと思います。

むしろ、ビットセットは、元の標準テンプレートライブラリをC++標準に追加するという提案よりも前から存在するクラスの1つです。それが設計されたとき、標準ライブラリの本質的にnoneには反復子が含まれていました。

その後、ステパノフのライブラリが追加のために提案され、かなりの部分が受け入れられました。これに対応して、いくつかの既存のクラス(std::stringなど)が追加され、新しいコンテナクラスのように使用できるようになりました。

これはすべて、標準化プロセスのかなり後の方で起こっていました。実際、彼らはすでにいくつかの場所でルールを曲げて、彼らが行ったことを追加しました。とりわけ、コンテナ/イテレータ/アルゴリズムがライブラリに追加されたのとほぼ同時に、委員会は標準の「機能完了」を検討するように投票したので、それ以降は、バグの修正などにのみ取り組みます。新機能を追加していません。

そのため、bitsetにイテレータインターフェースを追加する提案が書かれていたとしても、委員会が受け入れることができる唯一の方法は、これを新機能ではなく修正されたバグとして扱うことでした。追加されました。本当に確かな提案があったとしたら、彼らはできたと思いますが、そのような提案はなかったと思います。ポイントをかなり引き延ばしていたので、本当に良い提案でさえも簡単に却下されたかもしれません。

それ以来、1つの提案 LEWG 1112 があり、std::bitsetにイテレータインターフェースが追加されました。これはC++ 11で提案され、C++ 11でも追加された範囲ベースのforループをサポートするために特別に提案されました。それはかなり悪名高い運命に苦しみました:それはもともと受け入れられ、表現が起草されました。その後、言語に概念を追加する提案が受け入れられるように見えたため、この表現は、光沢のある素晴らしい新しい概念を使用するように書き直されました。しばらくして、概念が言語から削除され、概念に依存しないように提案を言い換えるのではなく、暫定的に「NADフューチャー」としてマークしました。将来の(不定の)時まで(そして、私が見る限り、それ以来、再訪していません)。

9
Jerry Coffin

独自のイテレータを作成するか、単に 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, "
0
Diegum