0

私がデータ構造を持っているとすれば、

struct data{
int val;
};
struct data A[LEN]; // LEN: some length.

// the below operator would be used in sorting.
bool operator < (struct data &a1, struct data &a2){
return a1.val < a2.val;
}

int main(){
// fill up A.
sort(A, A+LEN); // sort up A

/*Now I want something like this to happen ..
x = find(A, A+LEN, value); -> return the index such that A[index].val = value,
find is the stl find function .. 
*/
}

どうやってそれをしますか?また、任意の stl 関数について、指定された条件で機能するようにオーバーライドする演算子をどのように知ることができますか?

4

2 に答える 2

3

このような場合に要素を見つけるために必要な変更は、ごくわずかです。operator<最初に、その引数を参照として使用したいと考えていますconst(技術的には現在の演習では必要ありませんが、一般的にやりたいことです):

bool operator < (data const &a1, data const &a2){
    return a1.val < a2.val;
}

次に (特に にとって本当に重要な部分std::find) も定義する必要がありますoperator==

bool operator==(data const &a, data const &b) { 
    return a.val == b.val;
}

ただし、代わりに二分探索を使用する場合は、これを定義する必要がないことに注意してください。

auto pos = std::lower_bound(data, data+LEN, some_value);

これは、operator<すでに定義した を使用するだけです。いずれにせよアイテムがすでにソートされている場合は、通常はこれが望ましいでしょう (LEN が非常に小さい場合を除き、通常はかなり高速です)。

于 2013-07-21T05:06:39.523 に答える
2

構造体の配列に対してのみstd::find を機能させたい場合はoperator==、構造体データを定義する必要があります。

struct data
{
   data(int value=0) : val(value) {}
   int val;
};

bool operator==(const data& l, const data& r) { return l.val == r.val;}

auto x = find(A, A+LEN, value);

また

auto x = find(A, A+LEN, data(value));

A の値のインデックスを取得するには、std::distanceを使用します

std::distance(A, x);

注: ソートされたコンテナーでより十分な検索を行うには、代わりに std:: lower_boundstd::uppper_boundstd::binary_searchを使用してください。

auto lower = std::lower_bound(A, A+LEN, data(3));
auto upper = std::upper_bound(A, A+LEN, data(3));

operator<関数の署名は次のようにすることをお勧めします。

bool operator < (const data &a1, const data &a2)
//               ^^^^^           ^^^^^
于 2013-07-21T05:05:46.833 に答える