2016-05-26 2 views
1

У меня возникла проблема с поиском элемента кортежа в векторе кортежей.Найти определенный элемент кортежа в векторе кортежей?

У меня есть vector<tuple<int,int,int,int>>, в котором мне нужно найти позицию в векторе, где get<0>(vector) = 0. Мне нужна позиция, так как мне нужно также извлечь другие значения из кортежа в этом положении.

Значение get<0> уникально и будет происходить только один раз в векторе.

Как это сделать?

ответ

5

Следует использовать алгоритм std::find_if;

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

Это положение, которое оно предоставляет мне или ?, так как вы используете авто? – Lamda

+0

'it' - это итератор, он либо указывает на найденное значение, либо' v.end() ', если не найден, следовательно, тест' if (it! = V.end()) '. – dkg

+0

@Lamda Как правило, если вы не знаете, что такое фактический тип при использовании auto, посмотрите на контекст. Здесь я сравниваю его с «v.end()», поэтому он должен быть итератором. Если все еще не уверены, проверьте подпись функции :). Я слышал, что такая жалоба на автоматическое создание кода неясно все время, но если вы знаете контекст, это не так уж плохо :) – Arunmu

5

Вы можете использовать алгоритм std::find_if для обхода элементов и проверки необходимого вам условия.

Примечание; код здесь предполагается, что вы хотите найти элемент в векторе, где первый элемент кортежа является 0.

#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 выше использует форму, которая принимает предикат;

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

И он возвращается;

Возвращает [итератор] первый элемент в диапазоне [first, last), который удовлетворяет определенным критериям ...


более краткий синтаксис, который может быть использован, но требует поддержки языка для C++ 14 и далее;

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

Для C++ 14 и тех, кто не хочет пытать их глаза.

#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; 
}; 
Смежные вопросы