2012-08-17 20 views
6

Supongamos que tengo el siguiente código:find_if y std :: pair, pero sólo un elemento

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

ahora tengo que buscar sólo por un elemento de int en ellos, así que:

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

¿Cómo puedo hacerlo?

+0

¿Tiene C++ 11 o impulso? – Flexo

+0

¿Está buscando con un valor o un predicado? – ecatmur

Respuesta

13

Escribe un predicado unario que toma un std::pair, y devuelve verdadero si el elemento first es igual a un valor dado.

Por ejemplo:

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

Entonces

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

Este utiliza C++ 11 expresiones lambda, y dado un value que desea encontrar:

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

donde container es myVec o myList.

La expresión lambda [&value](...){...} es la equivalencia funcional de una expresión temporal (al igual que puede pasar "3 + 2" como un argumento a un parámetro int. Será traducido a un objeto función (al igual que el de la juanchopanza responder) por el compilador se le salva de escribir y mantiene su código localizada

+0

@Flexo a typo. fijo. – TemplateRex

+1

¿Otro error tipográfico? 'int' no tiene un' primer'. – juanchopanza

+1

@juanchopanza Deseando tener 'auto' en lambdas 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; 
    } 
}; 

el fin de encontrar valor int necesaria que debe utilizar lo siguiente:..

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

por ejemplo:

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; 
    } 
Cuestiones relacionadas