我正在尝试重构一些不使用STL来使用它提供的通用算法的代码。 我有这样的结构:
struct A {
int i;
//other stuff...
};
// ...
A* array; // array of A objects, sorted by A::i member
int n = ...; // array size
然后有一个编码的函数需要A
,n
和一个整数k
,其目的是指向我的第一个和最后一个元素。 i
成员等于k
的数组。
这是在二进制搜索方面手工实现的。我在考虑使用std::equal_range
。问题是它需要A类对象才能工作,它迫使我引入一个“虚拟”A对象,其i
成员等于k
。
有没有办法使用STL来做到这一点,而不必引入“虚拟”对象? 感谢
答案 0 :(得分:4)
如果根据A::i
的值对您的范围进行排序,则可以使用custom comparator进行排序,但请注意,比较器必须能够兼顾两种方式:
struct AComp
{
bool operator()(int n, A const & a) const { return n < a.i; }
bool operator()(A const & a, int n) const { return a.i < n; }
};
auto p = std::equal_range(array, array + n, 5, AComp());
现在,范围[p.first, p.second)
包含A::i
等于5
的元素。
链接页面或多或少包含此示例。
答案 1 :(得分:1)
您也可以使用std::binary_search()
中定义的<algorithm>
进行二进制搜索。原型是:
template <class ForwardIterator, class T>
bool binary_search (ForwardIterator first, ForwardIterator last,
const T& val);
或:
template <class ForwardIterator, class T, class Compare>
bool binary_search (ForwardIterator first, ForwardIterator last,
const T& val, Compare comp);
答案 2 :(得分:0)
你可以定义一个转换运算符(我猜这更像是黑客)
class A
{
private:
int i;
public:
A(int x) : i(x){}
operator int(){
return i;
}
};
如果这样做,你不必定义运算符&lt;在你的结构中。