2012-08-17 20 views
6

varsayalım Aşağıdaki kodu var:find_if ve std :: çifti, ama sadece bir eleman

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 */ 

Şimdi ben sadece onlara bir int eleman aramak gerekir Yani:

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

nasıl yapabilirim?

+0

C++ 11 veya boost var mı? – Flexo

+0

Bir değer mi yoksa bir yüklem mi arıyorsunuz? – ecatmur

cevap

13

Bir std::pair alır ve first öğesi belirli bir değere eşitse, true değerini döndürür.

Örneğin

:

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

container:

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

Sonra

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

Bu C++ 11 lambda ifadeleri kullanır ve verilen bulmak istediğiniz bir valuemyVec veya myList.

lambda ifade [&value](...){...} bir int parametresine bir bağımsız değişken olarak "3 + 2" geçebilir gibi çok geçici ekspresyon (fonksiyonel muadilidir. Bu kadar juanchopanza 's gibi bir işlev nesnesinin (çevrilir derleyici tarafından) cevap O yazma zahmetinden kurtarır ve kod lokalize tutar

+0

@ Bir yazım hatası. sabit. – TemplateRex

+1

Başka bir yazım hatası mı? '' '' '' '' '' '' değil. – juanchopanza

+1

@juanchopanza Lambda'da 'auto' olmaktan kaçınmak http://cpp-next.com/archive/2011/12/a-breakthrough-for-concepts/ – 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; 
    } 
}; 

kullanmanız gereken gerekli int değerini bulmak için aşağıdakileri yapın:.. Örneğin

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)); 

:

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; 
    } 
İlgili konular