3

次のデータを含むマップがあります。

id    prev abundance  thing
1573  -1      0       book
1864  1573    39      beds
2075  1864    41      tray
1760  2075    46      cups

マップは次のとおりです。

map<int id, Abund*> oldMap;
struct Abund
{
int prev;
int abundance;
string thing;
}

次のような新しいマップを作成する必要があります。

 id2    prev2 prevAbun next2  nextAbun  thing2
 1573     -1            1864   39        book
 1864   1573     0      2075   41        beds
 2075   1864     39     1760   46        tray
 1760   2075     41                      cups

マップ1の前の行と次の行は、newMapの列になるはずです。これまでに、新しいマップと新しい構造体を作成しました。

struct NewAbund
{
vector<int> prev2;
vector<int> prevAbun;
vector<int> next2;
vector<int> nextAbun;
string thing2;
}
map<int id2, NewAbund*> newMap;

今では、oldMapから前の行を取得し、それをnewMapに値として配置するために、ロジックがどのように機能する必要があるのか​​わかりません。前もって感謝します!!

4

1 に答える 1

3

マップを反復処理するだけで、キー順にペアを指すイテレータが表示されます。したがって、反復中に前のイテレータを覚えている場合は、2つの連続したイテレータがあり、そこから新しいベクトルを入力できます。

一方、順序付けられたマップでは常に次と前のキーを見つけることができるため(O(log n)時間かかりますが)、データを非正規化するためにすべての問題に取り組む必要はない場合があります。c ++ 11を使用している場合は、std::nextとstd::prevがあり、これらの操作を非常に簡単に実行できます。(そうでない場合-なぜそうではないのですか?-std :: Advanceの観点から簡単に定義できます。)

于 2012-10-05T04:32:58.387 に答える