如何在C ++中修改现有的stl find函数?

时间:2013-07-21 04:52:21

标签: c++ stl

鉴于我有数据结构,

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函数,您如何知道要覆盖哪些运算符以使其在给定条件下工作?

2 个答案:

答案 0 :(得分: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很小,否则通常会快一点)。

答案 1 :(得分: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);

OR

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)
//               ^^^^^           ^^^^^