2017-03-01 1 views
4

私はクラスオブジェクトのベクトルを整数インデックスでソートしています。しかし、オブジェクトのインデックスはクラスのメンバ関数によって生成されるので、メンバ変数としてint idは格納されません。binary_searchは、そのメンバ関数の戻り変数でクラスオブジェクトを見つける[C++]

class boundary 
{ 
    public: 
    int get_id(); 
} 

std::vector<boundary> sample; 

は今、私はint idget_id()によって生成されていますboundaryオブジェクトを、見つける必要があり、私が探してるint valueと同じです。

auto &iter = binary_search(sample.begin(),sample.end(), 5, custom_function) 
//should compare iter.get_id() == 5 

この場合、binary_searchを使用できますか?これをどのように達成するのですか?

+0

idは 'get_id'機能によって生成され、フィールドに格納しない場合、私はあなたが得るいずれかのことをかなり確信していますどちらの場合でも、関数を呼び出すときにすべてのオブジェクトに対して同じ 'id'が返されます。あるいは、オブジェクトに対して多数の可能なIDを取得する場合、バイナリ検索は実用的ではありません。 –

+0

サンプル(ベクトル)には、探しているオブジェクトが含まれていない可能性があることを覚えておいてください。その場合、あなたの関数は何を返すのですか? – Andrzej

+0

@Andrzej、私が探しているオブジェクトは、ベクトルの中になければなりません。私はそれを主張する必要があります – hisham

答えて

5

あなたは、この場合にはstd :: LOWER_BOUNDを使用する必要があります。

bool custom_function(boundary& obj, int id) { return obj.get_id() < id; } 
... 
auto iter = lower_bound(sample.begin(),sample.end(), 5, custom_function); 

(あなたがより良いパフォーマンスをしたい場合は、関数オブジェクトと関数ポインタを置き換える)

あなたが「比較」を満たすオブジェクトを作成することができます
1

前提:あなたが求める要素(というよりも、それにイテレータ)へ参照を取得したいです。今

boundary& find_boundary(std::vector<boundary>& sample, int id) 
// precondition: a boundary with id does exist in the sample 
{ 
    auto less_by_id = [](boundary const& b, int id) // lambda is faster than function pointers 
    { return b.get_id() < id; }; 

    auto it = lower_bound(sample.begin(), sample.end(), id, less_by_id); 

    assert (it != sample.end()); 
    assert (it->get_id() == id); 
    return *it;  
} 

、あなたはそれを使用することができます。

boundary& b = find_boundary(sample, 5); 
関連する問題