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

4

2 に答える 2

17

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

むしろ、bitset は、元の標準テンプレート ライブラリを C++ 標準に追加するという提案よりも前のクラスの 1 つです。それが設計されたとき、本質的にどの標準ライブラリにもイテレータが含まれていませんでした。

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

ただし、これはすべて標準化プロセスのかなり遅い段階で行われていました。実際、彼らはすでにいくつかの場所でルールを曲げて、自分たちが行ったことを追加しています。とりわけ、コンテナ/イテレータ/アルゴリズムがライブラリに追加されたのとほぼ同時に、委員会は標準の「機能が完成した」と見なすことに投票したため、その時点から、バグの修正などにのみ取り組むことになりました。新しい機能を追加しません。

そのため、イテレータ インターフェイスを に追加するという提案が書かれたとしてもbitset、委員会がそれを受け入れることができた唯一の方法は、これを新機能の追加ではなくバグ修正として扱うことでした。すごくしっかりした提案があればできたのかもしれませんが、そういう提案はなかったと思いますし、かなり論点がずれていたので、すごくいい提案でも簡単に拒否されました。

それ以来、イテレータ インターフェイスを に追加するLEWG 1112std::bitsetという 1 つの提案がありました。これは C++11 向けに提案されたもので、特に範囲ベースのforC++11 でも追加されていたループ。それはかなり不名誉な運命をたどりました:それは最初に受け入れられ、文言が起草されました. その後、言語に概念を追加するという提案が受け入れられるように見えたので、この文言は、輝かしく素晴らしい新しい概念を使用するように書き直されました。しばらくして、概念は言語から削除され、概念に依存しないように提案を言い換えるのではなく、暫定的に「NAD Future」とマークしました。これは、それを欠陥ではないと見なし、それ以上の作業を延期したことを意味します。将来のある(無期限の)時間まで(そして、私が見る限り、それ以来再訪していません)。

于 2016-01-11T18:26:39.287 に答える