2012-08-17 7 views
6

Angenommen, ich habe den folgenden Code:find_if und std :: pair, aber nur ein Element

std::vector< std::pair <int, char> > myVec; 
or 
std::list< std::pair <int, char> > myList; 
/* then ***************/ 
std::list< std::pair <int, char> >::iterator listIt; 
or 
std::vector< std::pair <int, char> >::iterator vectorIt; 

/* No difference between vector and list */ 

Jetzt muss ich in ihnen nur für ein int Element suchen, So:

vectorIt = std::find_if(myVec.begin(),myVect.end(),make_pair(.....)); 
                ^^^^^^^^^^^^^^^^^ 

wie kann ich es tun?

+0

Haben Sie C++ 11 oder Boost? – Flexo

+0

Suchen Sie mit einem Wert oder einem Prädikat? – ecatmur

Antwort

13

Schreiben Sie ein unäres Prädikat, das eine std::pair akzeptiert, und gibt true zurück, wenn das Element first einem gegebenen Wert entspricht.

Zum Beispiel:

struct CompareFirst 
{ 
    CompareFirst(int val) : val_(val) {} 
    bool operator()(const std::pair<int,char>& elem) const { 
    return val_ == elem.first; 
    } 
    private: 
    int val_; 
}; 

Dann

// find first element with first == 42 
vectorIt = std::find_if(myVec.begin(),myVect.end(), CompareFirst(42)); 
11

Dieses verwendet C++ 11 Lambda-Ausdrücke, und da ein value, die Sie finden wollen:

std::find_if(container.begin(), container.end(), 
    [&value](std::pair<int, char> const& elem) { 
    return elem.first == value; 
}); 

wo container ist entweder myVec oder myList.

Der Lambda-Ausdruck [&value](...){...} ist die funktionale Äquivalenz eines temporären Ausdrucks (ähnlich wie Sie „3 + 2“ als Argument für einen int Parameter übergeben können. Es wird in juanchopanza ist wie die (viel zu einem Funktionsobjekt übersetzt werden Antwort) vom Compiler Es erspart Ihnen die Eingabe und hält Ihren Code lokalisiert

+0

@Flexo ein Tippfehler. Fest. – TemplateRex

+1

Ein weiterer Tippfehler? 'int' hat kein' first'. – juanchopanza

+1

@juanchopanza Verlangen nach "Auto" in Lambdas http://cpp-next.com/archive/2011/12/a-durchbruch-fur-konzepte/ – TemplateRex

2
template <class T,class S> struct pair_equal_to : binary_function <T,pair<T,S>,bool> { 
    bool operator() (const T& y, const pair<T,S>& x) const 
    { 
     return x.first==y; 
    } 
}; 

benötigt, um int-Wert finden Sie folgende verwenden sollten..

int find_me = 1;//chenge the value as you want 
vector< pair <int, char> >::iterator it = 
     find_if(myVec.begin(),myVec.end(),bind1st(pair_equal_to<int,char>(),find_me)); 

zum Beispiel:

int main() { 
    vector< pair <int, char> > myVec; 
    pair<int,char> p1 = make_pair(1,'a'); 
    pair<int,char> p2 = make_pair(2,'b'); 
    pair<int,char> p3 = make_pair(1,'c'); 
    myVec.push_back(p1); 
    myVec.push_back(p2); 
    myVec.push_back(p3); 
    vector< pair <int, char> >::iterator it = find_if(myVec.begin(),myVec.end(),bind1st(pair_equal_to<int,char>(),1)); 
    if (it == myVec.end()) { 
     cout << "not found\n"; 
    } 
    else { 
     cout<< "found - first instance is < " << it->first <<"," << it->second << " >"; 
    } 
     return 0; 
    } 
Verwandte Themen