鉴于我有数据结构,
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函数,您如何知道要覆盖哪些运算符以使其在给定条件下工作?
答案 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_bound,std::uppper_bound,std::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)
// ^^^^^ ^^^^^