97

(うまくいけば)私たち全員が知っているように、vector<bool>完全に壊れており、C配列として扱うことはできません。この機能を取得するための最良の方法は何ですか?これまでのところ、私が考えたアイデアは次のとおりです。

  • 代わりvector<char>に、または
  • ラッパークラスを使用してvector<bool_wrapper>

この問題をどのように処理しますか?機能が必要c_array()です。

副次的な質問として、この方法が必要ない場合、c_array()ランダムアクセスが必要な場合にこの問題に取り組むための最良の方法は何ですか?dequeまたは他のものを使用する必要がありますか?

編集:

  • 動的なサイズ設定が必要です。
  • 知らない人のために、それぞれが1ビットかかるvector<bool>ように専門化されています。boolしたがって、Cスタイルの配列に変換することはできません。
  • 「ラッパー」は少し誤称だと思います。私はこのようなことを考えていました:

もちろん、my_boolアライメントの問題が発生する可能性があるため、読み取る必要があります:(

struct my_bool
{
    bool the_bool;
};
vector<my_bool> haha_i_tricked_you;
4

8 に答える 8

42

std::dequeはい、アレイが必要ない場合に使用します。

それ以外の場合は、 Boost Containerにあるような、にvector特化していない代替手段を使用してください。bool

于 2009-03-22T00:29:16.613 に答える
23

それは興味深い問題です。

特殊化されていない場合に std::vector であったものが必要な場合は、おそらくそのようなものがあなたのケースでうまくいくでしょう:

#include <vector>
#include <iostream> 
#include <algorithm>

class Bool
{
public:

    Bool(): m_value(){}
    Bool( bool value ) : m_value(value){}

    operator bool() const { return m_value; }

    // the following operators are to allow bool* b = &v[0]; (v is a vector here).
    bool* operator& () { return &m_value; }
    const bool* operator& () const { return &m_value; }

private:

    bool m_value;

};




int main()
{
    std::vector<Bool> working_solution(10, false);


    working_solution[5] = true;
    working_solution[7] = true;


    for( int i = 0; i < working_solution.size(); ++i )
    {
        std::cout<< "Id " << i << " = " << working_solution[i] << "(" <<(working_solution[i] ? "true" : "false") << ")" <<std::endl; // i used ? : to be sure the boolean evaluation is correct
    }

    std::sort( working_solution.begin(), working_solution.end());
    std::cout<< "--- SORTED! ---" << std::endl;

    for( int i = 0; i < working_solution.size(); ++i )
    {
            bool* b = &working_solution[i]; // this works!

        std::cout<< "Id " << i << " = " << working_solution[i] << "(" << (working_solution[i] ? "true" : "false") << ")" <<std::endl; // i used ? : to be sure the boolean evaluation is correct
    }

    std::cin.get();
    return 0;
}

これを VC9 で試してみたところ、問題なく動作するようです。Bool クラスの考え方は、同じ動作とサイズ (ただし同じ型ではない) を提供することによって bool 型をシミュレートすることです。ここでは、ほぼすべての作業が bool 演算子とデフォルトのコピー コンストラクターによって行われます。アルゴリズムを使用するときに想定どおりに反応するように並べ替えを追加しました。

すべてのケースに適合するかどうかはわかりません。それがあなたのニーズに合っていれば、ベクトルのようなクラスを書き直すよりも手間がかかりません...

于 2009-03-22T01:20:20.830 に答える
19

ニーズによって異なります。私はどちらかに行きますstd::vector<unsigned char>。機能のサブセットのみを使用する場合は、ラッパーを作成することで問題が発生する可能性があります。そうしないと、悪夢になります。

于 2009-03-22T00:30:12.697 に答える
13

皆さんはこの問題をどのように処理しますか? c_array() 機能が必要です。

boost::container::vector<bool>:

vector < bool > 特殊化は非常に問題があり、非推奨にするか標準から削除しようとする試みが何度か失敗しています。優れたBoost.DynamicBitsetソリューションBoost.Containerがあるため、実装しません。

...

したがって、boost::container::vector::iteratorは実際の bool 参照を返し、完全に準拠したコンテナーとして機能します。boost::container::vector < bool > 機能のメモリ最適化バージョンが必要な場合は、Boost.DynamicBitsetを使用してください。

于 2013-04-12T03:13:09.800 に答える
6

vector< int > の使用を検討してください。コンパイルと型チェックを通過すると、bool と int はどちらも機械語にすぎません (編集: 明らかにこれは常に正しいとは限りませんが、多くの PC アーキテクチャでは正しいでしょう)。警告なしで変換したい場合は、"bool foo = !!bar" を使用します。これは、ゼロを false に、ゼロ以外を true に変換します。

vector< char > などは使用するスペースが少なくなりますが、文字は機械語のサイズよりも小さいため、状況によっては (非常に小さい) 速度が低下する可能性もあります。これが、bool が char ではなく int を使用して実装されている主な理由だと思います。

本当にクリーンなセマンティクスが必要な場合は、独自のブール型クラスを作成するという提案も気に入っています。ブール型のように見え、ブール型のように機能しますが、テンプレートの特殊化をだますことはできません。

また、vector< bool > 特殊化を C++ 標準から削除したい (bit_vector で置き換える) ことを望む人々のクラブへようこそ。それはすべてのクールな子供たちがたむろする場所です:)。

于 2009-03-22T09:03:25.037 に答える
4

この問題は、comp.lang.c++.moderatedで既に議論されています。提案された解決策:

  • 独自のアロケータ (に基づくstd::allocator) と独自のベクトルの特殊化。
  • 使用しますstd::deque(S. Mayersの本の1つで早期に推奨されました)-しかし、これはあなたの要件には当てはまりません;
  • PODboolラッパーを作成します。
  • 代わりに同じサイズの何か (//etc) を使用charします。 intboolbool

また、初期に標準委員会の提案を見ました-マクロ(のようなものSTD_VECTOR_BOOL_SPECIAL)を導入してこの専門化を禁止します-しかし、知る限り、この提案は stl 実装で実装されておらず、承認されませんでした。

あなたの問題にはこれをうまく行う方法がないようです...おそらくC++ 0xで。

于 2009-03-22T01:52:21.860 に答える
3

最も簡単な答えは、vector<struct sb>where sbisを使用することですstruct {boolean b};。それからあなたは言うことができますpush_back({true})。良いように思える。

于 2015-06-23T21:19:30.647 に答える