地图中的C ++ find_if元素

时间:2017-11-12 21:29:03

标签: c++ containers

我试图了解find_if函数和map容器的工作原理。我在Map.cpp中有功能 - Tile& Map :: getTile(const Point& point),它从地图容器中返回Tile。我应该通过容器检查当前地图Tile的Point位置==函数的参数。

我不确定find_if的第三个参数 - 如何将实际点的参数从map传递给operator ==()并返回找到的Tile? 如果我应该提供完整的.cpp文件,请告诉我。谢谢你的时间!

Map.cpp

#include "map.h"
#include <iostream>
#include <map>
#include <algorithm>
    Map::Map(int rows, int columns, int mines) {
        this->rows = rows;
        this->columns = columns;
        this->totalMines = mines;
        std::map<Point, Tile> tileContainer = {};
    }


    Tile& Map::getTile(const Point& point) {
        std::map<Point, Tile>::iterator it = std::find_if(tileContainer.begin(), tileContainer.end(), point.operator==(?);

    }

Point.h

#include "interfaces.h"
    struct Point : public APoint {
    private:
        int row;
        int column;
    public:
        Point(int row, int column);
        ~Point();
        int getRow() const;
        int getColumn() const;
        bool isInContact(const Point& point) const;
        bool operator==(const Point& point) const;
        bool operator!=(const Point& point) const;
    };

Tile.h

#include "interfaces.h"
#include "point.h"
    struct Tile : public ATile {
    private:
        Point& position;
        int bombsInNeighbourhood;
        bool bombTile;
        TileState tileState;
    public:
        Tile(const Point& position);
        ~Tile();
        const Point& getPosition();
        void setPosition(const Point& position);
        int getBombsInNeighbourhood() const;
        void setBombsInNeighbourhood(int bombsInNeighbourhood);
        bool isBombTile() const;
        void setBombTile(bool bombTile);
        TileState getTileState() const;
        void setTileState(TileState tileState);
    };

Map.h

#include "interfaces.h" 
#include "point.h"
#include "tile.h"
    struct Map : public AMap {
    protected:
        int rows;
        int columns;
        int totalMines;
        std::map<Point&, Tile> tileContainer;
    public:
        Map(int rows, int columns, int mines);
        ~Map();
        Tile& getTile(const Point& point);
        Tile& getTile(int row, int column);
        const Tile& getTile(const Point& point) const;
        const Tile& getTile(int row, int column) const;

Point.cpp 我使用的功能:

bool Point::operator==(const Point& point) const {
    if (point.column == this->getColumn() && point.row == this->getRow()) {
        return true;
    }
    else {
        return false;
    }
}

1 个答案:

答案 0 :(得分:2)

std::find_if的第三个参数必须是UnaryPredicate。它需要一个参数并返回bool

您可以将以下内容用于UnaryPredicate。

  1. 非会员功能。
  2. 具有函数调用运算符operator()
  3. 的对象
  4. 一个lambda函数。
  5. 当您将std::find_if与[{1}}元素结合使用时,您必须考虑std::map的每个项目都是std::map。来自http://en.cppreference.com/w/cpp/container/map

    std::pair

    这是使用lambda函数解决问题的唯一方法。

    value_type  std::pair<const Key, T>
    

    但是,如果您只想比较密钥,也可以使用Tile& Map::getTile(const Point& point) { auto it = std::find_if(tileContainer.begin(), tileContainer.end(), [&point](std::pair<Point, Title> const& item) { return (point == item.first); }); ... }

    std::map::find