2012-04-03 6 views
0

Ich ändere meinen Code, damit es mir besser passt.Von Arrays zu Struktur ändern, die Arrays enthält

Ich hatte:

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

Jetzt habe ich:

deque<New_Array> visited; 

wo New_Array ist:

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

mein Array ist wie folgt:

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

Das Problem ist, dass ich eine else-if-Funktion wie folgt aus:

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

Diese Funktion prüft, ob ein Array in dem besuchten Stack-deque ist. Wenn nicht, funktioniert die else-Funktion. Aber jetzt muss die besuchte Deque Strukturen enthalten, keine Arrays. Wie kann ich diese Funktion mit den neuen Containern der Deque umwandeln?

Ich machte diese Änderung, so dass jedes Array mit einer Nummer (h) verbunden werden konnte. Ich muss das Array überprüfen, mir ist die Nummer egal.

EDIT:

Fehler C2678: binary '==': fand keinen Operator, der einen linken Operanden des Typs 'New_Array' nimmt (oder es ist kein akzeptabler Umwandlung)

+1

Zu Ihrer Bearbeitung müssen Sie die Funktion 'bool operator == definieren (const NewArray & n, const array , 4> & a) {return n.pinak == a); } ' –

+0

@ Robᵩ Diese Funktion funktioniert für mich. Bitte machen Sie einen Post davon, damit ich diese Antwort annehmen kann. –

+0

Das war die Antwort von DRVic, mein Kommentar füllte es einfach aus. Gehen Sie weiter und akzeptieren Sie seine Antwort, da das Ihr Problem gelöst hat. –

Antwort

0

Wenn ich Lesen Sie Ihre Frage richtig, was Sie tun müssen, ist einen Gleichheitsoperator für Ihre Struktur zu definieren. Dann kann die Suche diesen Operator bei der Suche verwenden.

+0

Wie kann ich das tun? Gibt es einen leichteren Weg? –

+0

Gut Teil der Antwort ist, einen Operator == (const NewArray &);) hinzuzufügen, aber der andere Teil der Antwort ist, müssen Sie entscheiden, was zwei Arrays gleich macht. Sind sie das gleiche Array (Zeigergleichheit) oder haben sie das gleiche Elemente (Element für Element vergleichen)? – DRVic

2

Vielleicht können Sie std::find_if verwenden:

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) gibt einen Iterator auf das erste Element im Bereich [first, last), für die es pred angewendet wird, ist wahr.

Die ersten und zweiten Parameter, visited.begin() und visited.end() specifiy, dass wir die std::deque<NewArray>visited genannt untersuchen sollte.

Also gehen wir durch die std::deque namens visited, testen jedes Element der Reihe nach.

Für jedes Element des deque, wenden wir dieses Prädikat:

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

Diese Syntax ist ein Lambda-Ausdruck. Es erstellt ein Objekt, das anschließend vom Operator () aufgerufen werden kann (was tatsächlich find_if tut).

Der erste Teil der Lambda listet Variable auf, die dem Körper des Ausdrucks zur Verfügung gestellt wird. In diesem Fall stellt [&myarray] diese Variable im Körper durch const-Verweis zur Verfügung.Der nächste Teil ist die Parameterliste von operator(): (const NewArray& newArray). Es hat dieselbe Bedeutung wie in jeder anderen Funktion. Der Körper des Ausdrucks vergleicht schließlich das übergebene Element von visited mit der Variablen myarray. Um die Gleichheit zu bestimmen, vergleichen wir das Array mit dem Mitglied der übergebenen Struktur.

Kurz gesagt, die find_if Funktion:

  • Wanderungen durch jedes Element visited. Für jedes Element, das:
  • Ruft die gelisteten Funktion, das
  • das pinak Mitglied Element Vergleichbar myarray

find_if dann gibt einen Iterator, der auf das ausgewählte Element Punkte oder .end() wenn keiner gleich vergleichen.

+0

Können Sie in Ihrem Beitrag erklären, was diese Zeilen tun? –

+0

Ich hoffe, dass das hilft. –

Verwandte Themen