vector<MyClass*> 的下限

703*_*703 5 c++ vector lower-bound

我有这个简单的类:

class MyClass {
public:
    int id;
    string name;

};
Run Code Online (Sandbox Code Playgroud)

我想要一个带有指向此类对象的指针的向量,该对象按引用的MyClass id. 我认为使用lower_bound会很容易,我以前用对象向量(不是指针)做过。对于对象,我operator<像这样重载:

bool operator<(MyClass left, int right) {
    return (left.id < right);
}
Run Code Online (Sandbox Code Playgroud)

然后我曾经lower_bound将新MyClass对象插入到排序向量中。

vector<MyClass>::iterator low;
low = lower_bound(vectorname.begin(),vectorname.end(),id);
prP = idContainer.begin();
prP = idContainer.insert(low, newobject); 
Run Code Online (Sandbox Code Playgroud)

我不知道如何对MyClass指针向量做同样的事情。任何人都可以帮助我实现这一目标吗?

Bar*_*rry 6

有两种重载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 );
Run Code Online (Sandbox Code Playgroud)

第一个是您用于您的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;
    });
Run Code Online (Sandbox Code Playgroud)

比较采用两个不同类型的参数有点奇怪,但事实就是如此。

注意:您的 currentoperator<value接受其参数。这会导致不必要的副本。您需要更改它以通过引用来获取它们const