0

コードを変更して、自分に合うようにします。

私が持っていた:

deque<array<array<int,4>,4>> visited;

今私が持っています :

deque<New_Array> visited;

ここで、New_Arrayは次のとおりです。

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

私の配列は次のようなものです:

array<array<int,4>,4> myarray;

問題は、次のようなelse-if関数があることです。

else if (find(visited.begin(), visited.end(), myarray)==visited.end())

この関数は、配列が訪問先のstack-dequeにあるかどうかをチェックします。そうでない場合は、else関数が機能します。ただし、ここで、訪問した両端キューには、配列ではなく構造体が含まれている必要があります。 この関数をdequeの新しいコンテナで動作する ように変換するにはどうすればよいですか?

この変更を行ったのは、各配列を数値(h)で接続できるようにするためです。配列を確認する必要があります。番号は気にしません。

編集:

エラーC2678:バイナリ'==':タイプ'New_Array'の左側のオペランドをとる演算子が見つかりません(または受け入れ可能な変換がありません)

4

2 に答える 2

2

おそらくあなたは使用することができますstd::find_if

else if (find_if(visited.begin(), visited.end(), 
         [&myarray](const NewArray& newArray) {
           return myarray == newArray.pinak;
         }) == visited.end())

std::find_if(Iterator first, Iterator last, Predicate pred)[first,last) の範囲内で pred の適用が true である最初の要素へのイテレータを返します。

1 番目と 2 番目のパラメータ とはvisited.begin()、名前付きvisited.end()を調べる必要があることを指定します。std::deque<NewArray>visited

std::dequeそのため、呼び出された を順に見ていきvisited、各要素を順番にテストします。

両端キューの各要素に対して、次の述語を適用します。

[&myarray](consts NewArray& newArray) { return myarray == newArray.pinak }

この構文はラムダ式です。()その後、オペレーターが呼び出すことができるオブジェクトを作成します(find_if実際にはそうです)。

ラムダ リストの最初の部分は、式の本体で使用できるようになる変数をリストします。この場合、[&myarray]const 参照によって、その変数を本体で使用できるようにします。

次の部分は : のパラメーター リストoperator()です(const NewArray& newArray)。他の関数と同じ意味です。

最後に、式の本体で、渡された要素 とvisited変数を比較しますmyarray。等しいかどうかを判断するために、配列をpinak渡された構造体のメンバーと比較します。

要するに、find_if関数:

  • のすべての要素をウォークスルーしますvisited。各要素について、次のことを行います。
  • リストされた関数を呼び出します。
  • 要素のpinakメンバーを比較しますmyarray

find_if次に、選択された要素を指す反復子を返します.end()。等しいものがない場合は、反復子を返します。

于 2012-04-03T19:53:11.843 に答える
0

私があなたの質問を正しく読んだ場合、あなたがする必要があるのはあなたの構造体の等式演算子を定義することです。次に、検索でその演算子を検索に使用できます。

于 2012-04-03T19:45:54.780 に答える