2012-12-24 35 views
5

Say mam wektor takiego:C++ w std :: vector

vector< pair<string, pair<int, int> > > cont; 

teraz chcę w cont znaleźć ELEM która ma swoją first równa "ABC". Jak mogę to łatwo zrobić z funktorami i algorytmami, które dostarcza STL (find_if, is_equal ??). (bez doładowania proszę i żadna nowa C++.)

EDIT: Czy jest to możliwe do zrobienia bez definiowania funktor orzecznika?

+1

Powiedziałeś to sam: 'std :: find_if'. Możesz też połączyć go z lambdą. – chris

+0

Dlaczego nienawiść do C++ 11? – nikhil

+0

Bez nienawiści, uwielbiamy to! :) – Narek

Odpowiedz

7

Coś

typedef std::pair<std::string, std::pair<int, int> > pair_t; 

struct Predicate : public std::unary_function<pair_t, bool> 
{ 
public: 
    Predicate(const std::string& s):value(s) { } 
    result_type operator() (const argument_type& pair) 
    { 
     return pair.first == value; 
    } 
private: 
    std::string value; 
}; 

std::vector<pair_t>::const_iterator pos = std::find_if(cont.begin(), cont.end(), 
Predicate("ABC")); 

lub lambda, jeśli C++ 11.

Naprawdę, istnieje jeden niedobry sposób na zrobienie czegoś takiego bez struktury.

typedef std::pair<std::string, std::pair<int, int> > pair_t; 

namespace std { 
template<> 
bool operator ==<> (const pair_t& first, const pair_t& second) 
{ 
    return first.first == second.first; 
} 
} 

std::vector<pair_t>::const_iterator pos = std::find_if(cont.begin(), cont.end(), 
std::bind2nd(std::equal_to<pair_t>(), std::make_pair("ABC", std::make_pair(1, 2)))); 
+0

Ze starszym standardem proszę? – Narek

+0

Dzięki za ładne rozwiązania.Czy można zrobić to samo bez definiowania predykatu? – Narek

+0

@ Narek, tak, przez kod hardcode "ABC". – ForEveR

1

Jeśli potrzebujesz szybciej niż O(N) wyszukiwania, można zastąpić vector z map (lub dodać równolegle) do O(log N) wyszukiwania (lub O(1) z unordered_map), nie funktor jest potrzebne:

vector<pair<string, pair<int,int>>> cont {{"ABC",{1,11}}, {"DFG",{2,22}}}; 
map  <string, pair<int,int>> M(cont.begin(), cont.end()); 
cout << M["ABC"] << endl; 

I używając RO library (haniebna wtyczka), będzie to po prostu:

#include <sto/sto.h> 
using namespace sto; 

... 
auto it = cont/(_0=="ABC"); 

Tutaj / przeciążone op, które wewnętrznie wywołuje find_if; _0 - odniesienie do pierwszego elementu krotki (lub pary) w wyrażeniu lambda STO; _0=="ABC" - wyrażenie lambda, które generuje predykat dla find_if

+0

nieuporządkowane struktury danych będą prawdopodobnie wolniejsze niż uporządkowane struktury danych, to zależy, z drugiej strony wektor i jego przydział dla ciągłej alokacji w pamięci może czasami być naprawdę exp ensive. – user1849534

Powiązane problemy