2017-10-04 4 views
0

Je veux trouver tous les tuples dans:Recherche binaire pour un tuple avec une valeur d'élément donné en C++

vector<tuple<int,int>> tuples; //already sorted 

qui évaluent la proposition suivante à "true":

(get<0>(tuple) == val) 

Je suis essayer d'utiliser la fonction equal_range pour obtenir une gamme:

equal_range (tuples.begin(), tuples.end(), val); 

Comment puis-je exprimer « val » correctement pour la comparaison de la valeur pour arriver dans le premier el ement des tuples?

+4

Il y a une surcharge de 'std :: equal_range' que [prend un comparateur] (http://en.cppreference.com/w/cpp/algorithm/equal_range) (prédicat binaire), donc vous pouvez lui passer un lambda ou un foncteur qui compare le 'std :: get <0>' de votre tuple – CoryKramer

Répondre

1

Vous pouvez faire un tuple et ignorer son dernier élément comme celui-ci:

#include <tuple> 
#include <algorithm> 
#include <vector> 
#include <functional> 

int main() 
{ 
    std::vector<std::tuple<int, int>> v = {{1,0}, {2,3}, {4,5}}; 

    const int val = 2; 

    std::equal_range(v.cbegin(), v.cend(), 
     std::make_tuple(std::cref(val), 0), 
     [&val] (const auto& l, const auto& r) { 
      return std::get<0>(l) < std::get<0>(r); 
     }); 
}