2012-01-05 23 views
0

に間接参照値との比較は、もともと私はこれをしなかった方法でstd::vector<Point>たメンバーを持っていましたstd::vector<Point*>となり、もはや働いていた従来の方法と私はそれを変更しなければならなかった:良いのstd ::ポインタのコレクションで見つけ、const参照値

bool Spline::Intersects(const Point& point) const { 
    for(std::vector<Point*>::const_iterator _iter = _result_points.begin(); _iter != _result_points.end(); ++_iter) { 
     if(*(*_iter) == point) return true; 
    } 
    return false; 
} 

std::findが同じ線形検索を実行していますか?もしそうなら、これを行うためのより速い/より良い/より少ない粗い方法があります(特にイテレータの二重参照解除)?

std::find(this->_result_points.begin(), _result_points.end(), point) != _result_points.end();(またはそれに類するが、反対の結果)が実行されるコードには他の場所があり、その遅い線形ループを使用する必要はありません。

+0

イテレータは2回参照解除する必要があります。これはC++の仕組みです。イテレータはポインタのように動作します。あなたのベクトルにはポイントポインタが含まれているので、イテレータはポインタへのポインタのように振る舞うので、2度間接参照する必要があります。 – Adrian

+0

@Adrian:イテレータがポインタで実装されるかどうかは、実装定義です。 –

+0

「イテレータのダブル・リファレンス解除」はありません。標準コンテナにポインタを格納していますが、これは愚かです。 –

答えて

3

はい、findは同じ線形検索を行います。

あなたは、適切な述語でfind_ifを使用することにより、ループ、ダブル間接を隠すことができます:bool operator()(Point* ptr) { return *ptr == point; }

あなたは線形検索を避けたい場合は、データが格納されている方法を変更する必要があります。例えば、ベクトルをソートしたままにすると、std::findよりも速いstd::binary_searchが可能になります。これは、値がではなく、がポインタ値でソートされているため、比較器をstd::sortなどに渡す必要があります。また、まったく別のコンテナを使用することもできます。(unordered_)(multi)setのいずれかです。

+0

クラスは、 'calc_spline'と' spline'に対するAllegro 4.2呼び出しのファサードです。 Allegroは、x値に対して 'int'の配列を返し、y値に対して' int'の配列を返します。私はそれがベジェ(sp?)カーブであり、理論上はすべての点が異なるため、x値でソートできるとお考えします。ありがとう。 – Casey

+0

'std :: binary_search'は今までになかった関数です。ほとんどの人は、バイナリ検索アルゴリズムを見つけたアイテムを返すと考えていますが、 'binary_search'はブール値を返すだけです。代わりに 'std :: lower_bound'を使用してください。 –

+0

@マーク:通常はyesですが、ここではすべての結果がそれをエンドイテレータと比較するために使用されています。だから、 'binary_search'はその名前が何であろうと、この仕事のためのツールです。範囲内に複数の等しい値がある場合、 'binary_search'はそれらのどれかを見つけるとすぐに救済されるかもしれませんが、'(lower | upper)_bound'は、最初の最後。 –

関連する問題