我试图了解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;
}
}
答案 0 :(得分:2)
std::find_if
的第三个参数必须是UnaryPredicate。它需要一个参数并返回bool
。
您可以将以下内容用于UnaryPredicate。
operator()
。当您将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