0

同じ括弧内にある場合、連続して番号を割り当てたい次の文字があります。例えば

   [a,b],[c],[d,e],[f,g],[h]
   a=0, b=1,c=2,d=3,e=4,f=5,g=6,h=7

指定された char から、c++ の std::map で実行できる数値を取得したいと考えています。ただし、これらの番号をマップで割り当てたら。[a,b] が 1 つの括弧内にあり、[c] が別であるという情報が失われています。残しておきたい情報です。

次のように使用できるデータ構造はありますか? .

私のアプローチはマップを使用することでした...しかし、[a、b]が同じブラケットにあるかどうかを後で調べるという私のニーズには合いません。同じブラケットに属するという情報を保持するだけでなく、番号を連続して割り当てるという私のニーズを満たすようなデータ構造を提案してください。

4

2 に答える 2

3

あなたが何を求めているのかは完全にはわかりませんが、この答えは私の現在の解釈に基づいています。文字がどのグループに属しているかに関する追加情報を格納する値型を使用することはできませんか? 例えば:

struct value_type
{
    int num;
    int group;
};
....
std::map<char, value_type> m;
m['a'].num   = 0;
m['a'].group = 0;
m['b'].num   = 1;
m['b'].group = 0;   // same group as 'a'
m['c'].num   = 2;
m['c'].group = 1;   // new group
// etc...

// testing if 'a' and 'b' are in the same group
if (m['a'].group == m['b'].group)
...
于 2013-03-10T16:32:55.620 に答える
1

他の人が指摘しているように、(私が知る限り)あなたのニーズに完全に適合するデータ構造はありません。ただし、自分で簡単に設計することはできます。いくつかの提案:

  • 各文字を、角かっこ番号と文字番号を含むタプルまたは構造体にマップします。

    struct CharData { int group; int characterNumber; };
    std::map<char, CharData> data;
    
  • 2つのコンテナを使用します。1つは文字グループ/角かっこのリストを含み、もう1つはプレーンマップです。

    std::vector<std::vector<char> > groups;  // Store groups in this container.
    std::map<char, int> mapping; // Store mapping to integers in this container.
    
  • マップのベクトルを使用します。

    std::vector<std::map<char, int> > data;
    

これらの表現を簡単に変換できます。ただし、通常の操作では複雑さが異なります。キャラクターが特定のグループに属しているかどうかを確認し、そのキャラクターがマップされている番号にアクセスできることが重要な場合は、最初の4つの解決策に進みます。グループのすべての文字を頻繁にリストする必要がある場合、または文字を複数のグループに含めることができる場合は、2番目のアプローチをお勧めします。最後のアプローチは、キャ​​ラクターが複数のグループの要素である可能性があり、グループに応じて異なる番号にマップする場合に役立ちます。

于 2013-03-10T16:50:42.193 に答える