vector_myclass *>的lower_bound

时间:2016-04-10 16:03:19

标签: c++ vector lower-bound

我有这个简单的课程:

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指针的向量做同样的事情。任何人都可以帮我实现吗?

1 个答案:

答案 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来更改它以获取它们。