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 haben operator== 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 Tiles, 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

InformationsquelleAutor Evan Ward | 2015-01-22
Schreibe einen Kommentar