0

この種のスタックを含む Deque があります。

struct New_Array {                    
    array<array<int,4>,4> mytable;       
    int h;
};

このスタックでは、2 つの異なる配列が同じ値の h を持つ場合があります。

deque<New_Array> Mydeque;

また、両端キュー ( の値) に異なる h がいくつあるかも知っていますsteps。また、deque( ) にはいくつのスタクトがありますかMydeque.size()

hごとに1つの配列を出力する必要があります。開始h=0までh=steps(ステップは既知のint値です)。印刷される各配列は、deque の最後に近い方でなければなりません。

私はこのようなことを試しました:

void foo(deque<New_Array> Mydeque, int steps)
 for(int i=0; i<steps; i++)
     {
        deque<New_Array>::iterator it;
        it = find(Mydeque.begin(),Mydeque.end(),i);
        PrintBoard(*it); // This if a function where you enter the New_Array struct 
                         // and it prints the array         
     }
}

上記は私に与えます:error C2679: binary '==' : no operator found which takes a right-hand operand of type 'const bool' (or there is no acceptable conversion)

またはこのようなもの:

void foo(deque<New_Array> Mydeque, int steps)
for(int i=0; i<steps; i++)
     {
        deque<New_Array>::iterator it;
        for(unsigned int j=0;j<Mydeque.size();j++)
            {
            it = find_if(Mydeque.begin(),Mydeque.end(),Mydeque[j].h==i);
            PrintBoard(*it);
            break;
            }           

     }

上記は私に与えます:error C2064: term does not evaluate to a function taking 1 arguments

EDITdequeソートされていません。それぞれhに anを出力するarray必要があります。これは、現時点で両端キューの終わりに近い arrayものである必要があります。

4

4 に答える 4

1

最後の値を覚えてスキップします。

assert(!Mydeque.empty());
int old_h = Mydeque[0].h + 1; // make sure it's different!

for (std::size_t i = 0, end != Mydeque.size(); i != end; ++i)
{
    if (Mydeque[i].h == old_h) continue;

    print(Mydeque[i]);
    old_h = Mydeque[i].h;
}
于 2012-06-18T12:58:57.823 に答える
1

まず、スタック上で宣言してstd::arrayいるため、ストレージもスタック上にあることに注意してください。これは、構造体の反復処理には、比較ごとに (4*4+1)*int のロードが含まれることを意味します。これがパフォーマンスに敏感な場合は、使用することをお勧めします。std::vectorこれは、ロードが外部ベクトル ポインターのみであり、h比較のみの場合であるためhです。

struct New_Array {                    
    vector<vector<int,4>,4> mytable;
    int h;
};

第 2 に、値を使用してこれらのテーブルにアクセスする必要がある場合h、または指定されたすべてのテーブルhに一度にアクセスする必要がある場合は、誰でも簡単にアクセスできるようにして、それらをマップ内のベクトルまたはベクトルの並べ替えられたベクトルとして格納します。

std::map<int,std::vector<New_Array> > rolodex;
rolodex[someNewArray.h].push_back(someNewArray);

これを順番に構築すると、各ベクトルの最初の項目が出力されます。

for(auto it : rolodex) {
    vector<New_Array> tablesForThisH = it->second;
    if(tablesForThisH.begin() != tablesForThisH.end())
       PrintBoard(it->second[0]);
}

そのstd:mapキーを昇順 (私が思うに) で格納 (および反復) するため、これは異なるh値を昇順で実行します。ここでも、int と vector ヘッダー (この質問hで述べたように、おそらく 12 バイト)だけである、スタックに格納された構造体をロードするだけで済みます。

コードが間違っている場合はご容赦ください。私の stl は少し錆びています。

于 2012-06-18T13:21:02.397 に答える
0

をループし、キーとして使用して、dequeすべての要素をに挿入します。値のセットは連続しているように見えるため、代わりに使用できますが、要素が既に検出されているかどうかをテストすることはより困難になります。maphhvector

于 2012-06-18T12:58:49.527 に答える
0

解決策は次のとおりです。

void Find_Solution_Path(deque<New_Array> Mydeque, int steps)
{
for(int i=0; i<steps+1; i++)
    {
        for(int j=Mydeque.size()-1;j>-1;j--)
        {
            if (Mydeque[j].h==i)
            {
                PrintBoard(Mydeque[j]);
                cout<<endl;
                break;
            }    
        }    
    }
}
于 2012-06-18T14:27:32.710 に答える