2017-11-12 7 views
0

find_if関数とマップコンテナの動作を理解しようとしています。私はMap.cppの関数を持っています - タイル& Map :: getTile(const Point & point)マップコンテナからTileを返します。私はコンテナを通過し、現在のマップタイルのポイント位置==関数の引数かどうかを確認する必要があります。C++ mapのfind_if要素

find_ifの3番目のパラメータについてわかりません - 実際のポイントのパラメータをマップから演算子==()に渡して、見つかった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 Iが使用関数:

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

代わりに 'std :: find'を使ってみてください。 – Tobias

答えて

2

std::find_ifに3番目の引数はUnaryPredicateでなければなりません。 1つの引数をとり、boolを返します。

UnaryPredicateには次のものを使用できます。

  1. メンバー以外の機能です。
  2. 関数呼び出し演算子、operator()を持つオブジェクトです。
  3. ラムダ関数。あなたがstd::mapの要素を持つstd::find_ifを使用している場合は

、あなたはstd::mapの各項目がstd::pairであることを考慮しなければなりません。 http://en.cppreference.com/w/cpp/container/mapから

ここでは、ラムダ関数を使用して問題を解決する方法を示します。

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); 

    ... 
} 
+0

'std :: find'はマップに' Point'sが含まれていないため動作しません。しかし実際の解決策は、 'std :: map :: find()'または 'std :: map :: at()'を呼び出すことです。 – juanchopanza

+0

@R Sahu '[= point]'あなたは[&ポイント] 'を意味しましたか? –

+0

@juanchopanza、エラーを指摘してくれてありがとう。 –