2016-05-26 12 views
1

Ich habe ein Problem mit der Suche nach einem Tupel-Element, in einem Vektor von Tupeln.Suchen Sie ein bestimmtes Tupel-Element in einem Vektor von Tupeln?

Ich habe eine vector<tuple<int,int,int,int>> in der ich die Position in dem Vektor wo get<0>(vector) = 0 finden muss. Ich brauche die Position, da ich auch die anderen Werte aus dem Tupel in dieser Position extrahieren muss. Der Wert get<0> ist einmalig und tritt nur einmal im Vektor auf.

Wie mache ich das?

Antwort

5

Sie sollten die std::find_if Algorithmus verwenden;

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

auto it = std::find_if(v.begin(), v.end(), [](const std::tuple<int,int,int,int>& e) {return std::get<0>(e) == 0;}); 
if (it != v.end()) { 
    std::cout << "Found" << std::endl; 
} 
+0

Ist es die Position, die es mir oder? Bietet, da Sie auto verwenden? – Lamda

+0

'it' ist ein Iterator, es zeigt entweder auf den gefundenen Wert oder' v.end() 'falls nicht gefunden, daher der Test' if (it! = Vend()) '. – dkg

+0

@Lamda Als allgemeine Empfehlung, wenn Sie nicht sicher sind, was der tatsächliche Typ ist, wenn Sie Auto verwenden, suchen Sie nach dem Kontext. Hier vergleiche ich es mit 'v.end()', also muss es ein Iterator sein. Wenn Sie sich noch nicht sicher sind, überprüfen Sie die Signatur der Funktion :). Ich höre solche Klagen darüber, dass Auto-Code die ganze Zeit unklar ist, aber wenn du den Kontext kennst, ist es nicht so schlimm :) – Arunmu

5

Sie können den Algorithmus std::find_if verwenden, um die Elemente zu durchlaufen und auf die von Ihnen gewünschte Bedingung zu testen.

Hinweis; der Code hier vorausgesetzt, dass Sie das Element in dem Vektor, bei dem das erste Elemente des Tupels 0 ist

#include <tuple> 
#include <vector> 
#include <algorithm> 
#include <iostream> 
int main() 
{ 
    using namespace std; 
    vector<tuple<int, int, int, int>> v; 
    v.emplace_back(0,1,2,3); 
    auto it = find_if(begin(v), end(v), [](decltype(*begin(v)) e) { 
     return get<0>(e) == 0; 
    }); 
    if (it != end(v)) 
     cout << get<0>(*it) << " " << get<1>(*it); 
} 

std::find_if oben verwendet die Form finden möchten, die ein Prädikat akzeptiert;

template< class InputIt, class UnaryPredicate > 
    InputIt find_if(InputIt first, InputIt last, UnaryPredicate p); 

Und es gibt;

Returns [ein Iterator to] das erste Element im Bereich [first, last), die bestimmte Kriterien erfüllt, ...


Eine weitere terse Syntax, die verwendet werden können, erfordert aber Sprachunterstützung für C Ab 14 Uhr;

find_if(begin(v), end(v), [](auto&& e) { return get<0>(e) == 0; }); 
1

Für C++ 14 und diejenigen, die ihre Augen nicht foltern wollen.

#include <tuple> 
#include <vector> 
#include <cstdlib> 
#include <algorithm> 

using std::get; 
using std::tuple; 
using std::vector; 
using std::find_if; 

int main(int, char**) 
{ 
    int needle = 0; 
    vector< tuple< int, int, int > > haystack; 

    auto position = find_if(haystack.begin(), haystack.end(), 
          [ = ](auto item) 
          { 
           return get<0>(item) == needle; 
          }); 

    if (position not_eq haystack.end()) 
     haystack.erase(position); 

    return EXIT_SUCCESS; 
}; 
Verwandte Themen