2015-09-16 9 views
8

ich eine Reihe von shared_ptr habe und möchte einen Wert darin finden:Suchen Sie einen Wert in einem Satz von shared_ptr

typedef std::shared_ptr<int> IntPtr; 

struct Compare { 
    bool operator() (const IntPtr& a, const IntPtr& b) { 
    return *a < *b; 
    } 
}; 
std::set<IntPtr, Compare> s; 

auto x = std::make_shared<int>(3); 
s.insert(x); 

bool found = s.find(std::make_shared<int>(3)) != s.end(); 

Es funktioniert, aber nicht effizient - es jedes Mal neu einen temporären Zeiger muß wenn Sie versuchen, einen Wert zu finden.

Gibt es einen anderen Weg?

Sieht aus wie Searching in a set of shared_ptr<QString> hat einige Ideen, die helfen könnten?

+0

_ "es muss jedes Mal ein Temp-Zeiger neu erstellt werden, wenn man versucht, einen Wert zu finden." _ Was soll das heißen? –

+0

Es ist das Argument von 's.find', das' std :: make_shared (3) ' – Gombat

+2

Es gibt auch' std :: find_if', und schließlich könnten Sie eine ungeordnete Menge verwenden? –

Antwort

14

(In C++ 14) a transparent one Ihre Komparator Stellen und zusätzliche Logik definiert für shared_ptr s mit int s gespeichert Vergleichen:

struct Compare 
{ 
    using is_transparent = void; 
    // ~~~~~~~~~~~~~^ 

    bool operator() (const IntPtr& a, const IntPtr& b) const 
    { 
     return *a < *b; 
    } 

    bool operator() (const IntPtr& a, int b) const 
    { 
     return *a < b; 
    } 

    bool operator() (int a, const IntPtr& b) const 
    { 
     return a < *b; 
    } 
}; 

DEMO

+1

Danke, upvoted, lernte heute etwas Neues. Das heißt, ich habe über transparente Komparatoren gelesen, aber es blieb nicht. Ich habe es keinem praktischen Anwendungsfall zugeordnet. –

0

Mit einem Programm Singlethread Sie das reduzieren Overhead zu einer einzigen globalen Zuweisung:

using Int_ptr_set = std::set<IntPtr, Compare>; 

auto find(int const v, Int_ptr_set const& values) 
    -> bool 
{ 
    static IntPtr p = std::make_shared<int>(0); 
    *p = v; 
    return values.find(p) != values.end(); 
} 

Haftungsausschluss: Code nicht berührt durch die Hände des Compilers.

Für Threading könnten Sie das oben genannte eine Methode einer Klasse mit als ein Mitglied machen, dann erstellen Sie eine Thread-lokale statische dieser Klasse.

Verwandte Themen