【发布时间】:2012-11-01 12:24:03
【问题描述】:
我有一个看起来像这样的结构,
struct Foo {
int a;
};
我有一个由这些结构组成的向量,看起来像这样,
vector<Foo> foos;
所有Foos 都使用STL sort() 函数按整数a 升序排序。现在我想获取成员字段a 小于或等于给定数字的Foo 对象,例如STL lower_bound() 函数。问题是 STL 的 lower_bound 函数声明如下所示:
template <class ForwardIterator, class T, class Compare>
ForwardIterator lower_bound ( ForwardIterator first, ForwardIterator last,
const T& value, Compare comp );
所以当我想做类似的事情时,
lower_bound(foos.begin(), foos.end(), 5, custom_comp);
我不能,因为我正在寻找的 int(在本例中为 5)不是 Foo 类型。我遇到了lower_bound()、upper_bound() 和binary_search() 的问题。 custom_comp 只定义了排序,并没有定义 a = 5 的对象实际上等于 int 5。
STL 有什么优雅的方法吗?
编辑:
我意识到我的例子并不能完全代表我的问题。我实际上拥有的是 Foo 包含两个整数,a 和 b。当我调用 lower_bound 时,我无权访问 b(因为我不在乎它)。现在 billz 答案的问题是我必须定义一个只接受 a 作为参数的构造函数,这在我看来不是很优雅(因为 b 未定义或任意,并且可以使用此构造函数代码中的任何位置)。但如果这是唯一的选择,我会接受。
【问题讨论】:
-
在 [stackoverflow.com/questions/5072257/… 中有更好的解决方案,这个问题可能与该问题重复。总结:在lower_bound模板中,类T不一定是两个迭代器[first,last)范围内的容器内容的数据类型。这意味着,T 可以只是一个要比较的整数。你可以把比较器写成
bool Compare(Foo & f, int value) { return f.a < value; }。它从 C++03 开始工作。