我有这个简单的课程:
class MyClass {
public:
int id;
string name;
};
我希望有一个带有指向此类对象的指针的向量,该对象按引用的MyClass
id
排序。我认为使用lower_bound
会很容易,我之前用对象向量(而不是指针)做过。对于对象,我像那样重载了operator<
:
bool operator<(MyClass left, int right) {
return (left.id < right);
}
然后我使用lower_bound
将新的MyClass
对象插入到已排序的向量中。
vector<MyClass>::iterator low;
low = lower_bound(vectorname.begin(),vectorname.end(),id);
prP = idContainer.begin();
prP = idContainer.insert(low, newobject);
我迷失了如何对MyClass
指针的向量做同样的事情。任何人都可以帮我实现吗?
答案 0 :(得分:2)
std::lower_bound
有两个重载:
template< class ForwardIt, class T >
ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value );
template< class ForwardIt, class T, class Compare >
ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value, Compare comp );
第一个是您用于vector<MyClass>
的一个,默认使用operator<
。第二个允许自定义比较函数,它将容器中的元素作为第一个参数,将值作为第二个参数。这就是您要用于vector<MyClass*>
的内容:
std::vector<MyClass*> pvec;
auto low = std::lower_bound(pvec.begin(), pvec.end(), id,
[](const MyClass* c, const MyClass& id) {
return *c < id;
});
比较采用不同类型的两个论点有点奇怪,但事实就是这样。
注意:您当前的operator<
通过 value 获取其参数。这会产生不必要的副本。您希望通过引用const
来更改它以获取它们。