2016-04-10 12 views
2

Ich habe diese einfache Klasse:lower_bound für Vektor <MyClass*>

class MyClass { 
public: 
    int id; 
    string name; 

}; 

Ich möchte einen Vektor mit Zeigern auf Objekte dieser Klasse haben, die von der referenzierten MyClassid sortiert ist. Ich dachte, dass mit wäre einfach, ich habe es vorher mit Vektoren von Objekten (nicht Zeiger). Bei Objekten, überlastete ich operator< wie folgt aus:

bool operator<(MyClass left, int right) { 
    return (left.id < right); 
} 

Dann habe ich lower_bound neue MyClass Objekt sortiert Vektor einzufügen.

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

Ich bin verloren, wie das gleiche mit dem Vektor von MyClass Zeigern zu tun. Kann mir jemand helfen, das zu erreichen?

Antwort

2

Es gibt zwei Überlastungen von 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); 

Die erste ist die, die Sie für Ihre vector<MyClass> verwendet, verwendet es operator< standardmäßig. Die zweite Funktion ermöglicht eine benutzerdefinierte Vergleichsfunktion, bei der ein Element aus dem Container als erstes Argument und der Wert als zweites Argument verwendet wird. Das ist, was Sie für Ihre vector<MyClass*> verwenden möchten:

std::vector<MyClass*> pvec; 
auto low = std::lower_bound(pvec.begin(), pvec.end(), id, 
    [](const MyClass* c, const MyClass& id) { 
     return *c < id; 
    }); 

Es ist ein wenig seltsam, dass der Vergleich zweier Argumente der verschiedenen Arten nimmt, aber das ist nur, wie es ist.

Hinweis: Ihre aktuelle operator< nimmt ihre Argumente von Wert. Das führt zu unnötigen Kopien. Sie möchten das ändern, indem Sie auf const verweisen.

+0

Vielen Dank Barry, das funktioniert für mich. – 703

+0

+1 für den Hinweis, dass die Vergleichsfunktion für beide Parameter nicht den gleichen Typ haben muss. –

Verwandte Themen