gpt4 book ai didi

map 中的 C++ find_if 元素

转载 作者:行者123 更新时间:2023-11-28 01:40:48 25 4
gpt4 key购买 nike

我想了解 find_if 函数和 map 容器的工作原理。我在 Map.cpp 中有函数 - Tile& Map::getTile(const Point& point) 从 map 容器返回 Tile。我应该遍历容器并检查当前 map Tile 的点位置是否 == 函数的参数。

我不确定 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==(?);

}

点.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;

点.cpp我使用的功能:

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

最佳答案

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

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

  1. 非成员函数。
  2. 具有函数调用运算符 operator() 的对象。
  3. 一个 lambda 函数。

当您将 std::find_ifstd::map 的元素一起使用时,您必须考虑 std::的每个项目: map 是一个 std::pair。来自 http://en.cppreference.com/w/cpp/container/map ,

value_type  std::pair<const Key, T>

这是您的问题的一种解决方案,使用 lambda 函数。

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

Tile& Map::getTile(const Point& point)
{
auto it = tileContainer.find(point);

...
}

关于 map 中的 C++ find_if 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47254187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com