2016-04-23 7 views
0

私はクラスを持っている場合はstd :: findそれはどのように機能するのですか?演算子==

class Point 
{ 
public: 
    Point() {} 
    Point(int _col, int _row) : row(_row), col(_col) {} 
    int row, col; 
}; 

どのように私はSTDを使用することができます::ポイントは、ベクター内に既にあるかどうかを確認するために()を見つけますか?演算子==をオーバーロードする必要がありますか?

私は、オブジェクトがstd::vectorであるが、それらのどれもが、それはオブジェクトまたはのポインタを比較するかどうかについて説明していないかどうかを確認するために検索を使用することをお勧めスタックオーバーフロー上で見つけるこの

#include <algorithm> 

if(std::find(v.begin(), v.end(), x) != v.end()) { 
    /* v contains x */ 
} else { 
    /* v does not contain x */ 
} 

ほぼすべての答えをやろうとしていますオブジェクトの実際の値

+0

[cppreference.com](http://en.cppreference.com/w/cpp/algorithm/find)は、通常、標準ライブラリの関数/クラスがどのように機能するかを調べるのに最適な場所です。まだ読んでいないのであれば、そのページを読むことをお勧めします(そして、何かがうまくいくかどうかという質問があれば、それをチェックするのが一般的です)。 – Cornstalks

+0

@Cornstalks:比較のために演算子==を使用していますが、以下の例では配列内のプリミティブ型のintを使用しています。私はオブジェクトの例を見つけませんでした。 FYIはJavaのバックグラウンドから来ています。 http://www.cplusplus.com/reference/algorithm/find/ –

+0

これは非常に危険なデフォルトコンストラクタです! –

答えて

2

C++標準(ドラフトN3242)([alg.find]セクション25.2.5に)言うstd::findその:

戻り次対応れる範囲[first,last)の最初のイテレータi条件は以下の通りです。*i == value [...]。そのようなイテレータが見つからない場合はlastを返します。

オブジェクトの値またはアドレスに基づいて検索するかどうかは、operator==の実装方法によって異なります。簡単な答えは:std::findoperator==がtrueを返すオブジェクトにイテレータを返します。

通常、これは値ベースの比較になります(通常、2つのオブジェクトの値を比較するためにoperator==が実装されているため)。std::findは、指定した値の範囲を検索する必要があります。あなたが提供したオブジェクトのアドレス)。

operator==はそれcompares based on address、そのようになるように実装することが可能です:このoperator==を使用して

bool operator==(const Point& left, const Point& right) { 
    return &left == &right; 
} 

はアドレスを比較し、そのstd::findは1あなたと同じアドレスを持つオブジェクトを検索します提供されました。しかし、このようにoperator==を実装するのは一般的には悪い考えです。ほとんどの人はそうのようなoperator==実装します:

bool operator==(const Point& left, const Point& right) { 
    return left.row == right.row && left.col == right.col; 
} 

std::findで使用される、compare Points based on their valuesをでしょう。

+0

最後のコードスニペットは私が探していたものです。 Thanks1 –

0

タイプが PODs基本タイプでない限り、等価関数、メンバー、またはそうでないものを指定する必要があります。

std::findの2つの基本バージョンがあります.1つは等価演算子を前提とし、もう1つは提供する等価関数を使用します。

等価または注文のために比較されるクラスにoperator==operator<を追加することをお勧めします。operator==は友人や公衆に値を公開することなく、比較することができます

class Point 
{ 
    int x; // These are private by default. 
    int y; 
    public: 
    Point(int new_x, int new_y) : x(new_x), y(new_y) 
    { ; } 
    bool operator==(const Point& p) const 
    { 
     return (x == p.x) && (y == p.y); 
    } 
}; 

メンバー方法:

はここにあなたのクラスの更新されたバージョンです。

あなたが自立比較機能を使用する場合は、値を公開するか、友人の機能を作るためにどちらかの必要があります。

class Point 
{ 
    int x; // These are private by default. 
    int y; 
    public: 
    Point(int new_x, int new_y) : x(new_x), y(new_y) 
    { ; } 
    friend bool operator==(const Point& a, const Point& b); 
}; 

bool operator==(const Point& a, const Point& b) 
{ 
    return (a.x == b.x) && (a.y == b.y); 
} 

あなたはstd::findで自立機能を使用したい場合は、例は次のようになります。

Equal_Pointsは、2点のメンバーを比較することができ、自立機能である
std::vector<Point> point_container; 
//... 
Point p; 
std::vector<Point>::const_iterator iter; 
iter = std::find(point_container.begin(), point_container.end(), 
       p, 
       Equal_Points); 

+0

* "あなたのタイプがPODでない限り" * - または*あなたのタイプがPODの場合。あるいは、私はあなたを誤解しています。 PODnessはなぜ重要なのでしょうか? –

+0

コンパイラは、 'int、float、'および 'char'などのPOD型の比較関数を出力します。より複雑なものは、比較演算子を必要とします。これは、「等価」の定義がクラスまたは構造に依存するためです。例えば、クラスは5つのメンバーを持つことができますが、2つだけが等価性を決定するために使用されます。 –

+0

基本的な型については、確かに。しかし、一般的なPODタイプではありません。 –

関連する問題