C++ - Wie verwendet man ein vector von reference_wrapper
Ich versuche umgestalten Teil des pathfinding-Algorithmus, die ich hatte, verwendet Zeiger, um keine Zeiger verwenden. Leider bin ich nicht so kenntnisreich über Referenzen. Ich bekomme die Fehlermeldung: Invalid operands to binary expression ('std::__1::reference_wrapper<Tile>' and 'const std::__1::reference_wrapper<Tile>')
Ich habe auch keine Ahnung, was das bedeutet. Mein code ist unten, und ich sammeln können, es kommt von der Zeile: openList.erase(std::find(openList.begin(), openList.end(), current));
aber ich bin mir nicht sicher, wie Sie dieses Problem zu beheben.
bool TileMap::tilesBetween(Tile& p_start, Tile& p_end)
{
std::vector<std::reference_wrapper<Tile>> openList;
std::vector<std::reference_wrapper<Tile>> closedList;
openList.push_back(p_start);
do
{
std::sort(openList.begin(), openList.end(), sortF());
Tile& current = openList[0];
closedList.push_back(current);
openList.erase(std::find(openList.begin(), openList.end(), current));
if(std::find(closedList.begin(), closedList.end(), p_end) != closedList.end())
{
return true;
}
std::vector<std::reference_wrapper<Tile>> adjacentTiles;
if (current.m_coordinates.x > 0)
{
adjacentTiles.push_back(m_tiles[current.m_coordinates.y * m_width + (current.m_coordinates.x - 1)]);
}
if (current.m_coordinates.x < m_width)
{
adjacentTiles.push_back(m_tiles[current.m_coordinates.y * m_width + (current.m_coordinates.x + 1)]);
}
if (current.m_coordinates.y > 0)
{
adjacentTiles.push_back(m_tiles[(current.m_coordinates.y - 1) * m_width + current.m_coordinates.x]);
}
if (current.m_coordinates.y < m_height)
{
adjacentTiles.push_back(m_tiles[(current.m_coordinates.y + 1) * m_width + current.m_coordinates.x]);
}
for(auto t : adjacentTiles)
{
if(std::find(closedList.begin(), closedList.end(), t) != closedList.end())
{
continue;
}
if(std::find(openList.begin(), openList.end(), t) == closedList.end())
{
openList.push_back(t);
}
}
}
while(!openList.empty());
return false;
}
EDIT: gepostet sortF
struct sortF
{
bool operator()(const Tile* p_a, const Tile* p_b) const
{
return p_a->f < p_b->f;
}
};
UPDATE: Wie pro den Vorschlag, habe ich geändert, die Funktion zu verwenden, Zeiger anstelle von Referenzen. Es SCHEINT zu funktionieren, aber ich habe mehr zu implementieren, bevor es fertig ist.
bool TileMap::tilesBetween(Tile* p_start, Tile* p_end)
{
std::vector<Tile*> openList;
std::vector<Tile*> closedList;
std::cout << p_start << ", ";
openList.push_back(p_start);
do
{
std::sort(openList.begin(), openList.end(), sortF());
Tile* current = openList[0];
closedList.push_back(current);
openList.erase(std::find(openList.begin(), openList.end(), current));
if(std::find(closedList.begin(), closedList.end(), p_end) != closedList.end())
{
return true;
}
std::vector<Tile*> adjacentTiles;
if (current->m_coordinates.x > 0)
{
adjacentTiles.push_back(&m_tiles[current->m_coordinates.y * m_width + (current->m_coordinates.x - 1)]);
}
if (current->m_coordinates.x < m_width)
{
std::cout << &m_tiles[current->m_coordinates.y * m_width + (current->m_coordinates.x + 1)] << std::endl;
adjacentTiles.push_back(&m_tiles[current->m_coordinates.y * m_width + (current->m_coordinates.x + 1)]);
}
if (current->m_coordinates.y > 0)
{
adjacentTiles.push_back(&m_tiles[(current->m_coordinates.y - 1) * m_width + current->m_coordinates.x]);
}
if (current->m_coordinates.y < m_height)
{
adjacentTiles.push_back(&m_tiles[(current->m_coordinates.y + 1) * m_width + current->m_coordinates.x]);
}
for(auto t : adjacentTiles)
{
if(std::find(closedList.begin(), closedList.end(), t) != closedList.end())
{
continue;
}
if(std::find(openList.begin(), openList.end(), t) == openList.end())
{
openList.push_back(t);
}
}
}
while(!openList.empty());
return false;
}
- Welche Zeile wird der Fehler kommen?
- Ich glaube, ich habe verengt es die
openList.erase(std::find(openList.begin(), openList.end(), current));
Linie. - Tut
Tile
habenoperator==
umgesetzt? - Nein, tut es nicht. Ich bin ziemlich neu in C++ aber ich schau, dass bis.
- Was ist
sortF
? Poste bitte die definition. - sortF ist ein struct, dass ich zu Sortieren die Fliesen auf einen int-Wert,
f
. - Ich versuche umgestalten Teil des pathfinding-Algorithmus, die ich hatte, verwendet Zeiger, um keine Zeiger verwenden, Warum? Es gibt nichts falsch mit der Verwendung von nicht-Besitz von raw-Pointern, insbesondere in Fällen wie diesem, wo der nutzen zu sein scheint, beschränkt sich auf eine einzelne Funktion.
- Würde das von mir verlangen, die Speicherung der
Tile
s, die als Zeiger? - Wenn du meinst außerhalb von
tilesBetween()
, dann Nein, es nicht sollte. - Ich werde testen, ob sich dann.
- Aber im ernst, post
sortF
. - Gepostet
sortF
oben. - Yep - siehe meine Antwort.
- TESTCASE
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::find
durchläuftstd::reference_wrapper<Tile>
und nichtTile&
selbst. Daherist falsch. Ändern Sie dies auf
std::reference_wrapper::get
Renditen der zugrunde liegenden Referenz.Einer einfachen, Beispiel um das zu demonstrieren,
reference_wrapper
ist nicht erforderlich, da es eine implizite Konvertierung BetreiberT&
. So können Sie vermeiden, die lambda und verwendenfind
solangeS
Gleichheit vergleichbar sind - coliru.stacked-crooked.com/a/4dcd9b9164a93645operator==
als member-Funktion, wenn ich es geändert, um eine externe Funktion Freund es hat geklappt! Dank dir habe ich gelernt hatte, über die symmetrischen Annahme made instd
's generische algorithmen.Dein problem ist hier:
Ihre
sortF
ist ein Ungültiger Vergleich-Objekt. Dieoperator()
muss wie folgt Aussehen:Statt:
Haben Sie einen Vektor, der
reference_wrapper<Tile>
, nicht ein Vektor, derTile*
.