2010-07-18 5 views
27

Я хочу использовать пару из STL в качестве ключа карты.Использование пары в качестве ключа на карте (C++/STL)

#include <iostream> 
#include <map> 

using namespace std; 

int main() { 

typedef pair<char*, int> Key; 
typedef map< Key , char*> Mapa; 

Key p1 ("Apple", 45); 
Key p2 ("Berry", 20); 

Mapa mapa; 

mapa.insert(p1, "Manzana"); 
mapa.insert(p2, "Arandano"); 

return 0; 

} 

Но компилятор бросает кучу нечитаемой информации, и я очень новичок в C и C++.

Как я могу использовать пару в качестве ключа на карте? И вообще Как я могу использовать любую структуру (объекты, структуры и т. Д.) В качестве ключа на карте?

Спасибо!

+7

В будущем, пожалуйста, напишите сообщения об ошибках, которые вы получаете. В противном случае люди могут часто быть трудными или невозможными для людей, чтобы помочь вам. :) –

+2

Если вы публикуете ошибки, я уверен, что мы также можем помочь объяснить, что они означают и как вы можете интерпретировать их, когда увидите их в будущем. –

+1

Обратите внимание, что, используя строковые литералы, сравниваются _addresses_ строк, а не сами строки. Вам лучше использовать 'std :: string'. – sbi

ответ

28

std::map::insert принимает один аргумент: пару ключ-значение, так что вам нужно будет использовать:

mapa.insert(std::make_pair(p1, "Manzana")); 

Вы должны использовать std::string вместо строк С в ваших типов. Как и сейчас, вы, скорее всего, не получите ожидаемых результатов, потому что поиск значений на карте будет сделан путем сравнения указателей, а не путем сравнения строк.

Если вы действительно хотите использовать строки C (которые, опять же, вам не следует), тогда вам нужно использовать const char* вместо char* в ваших типах.

И вообще Как я могу использовать любую структуру (объекты, структуры и т. Д.) В качестве ключа на карте?

Вам необходимо перегрузить operator< для ключа или использовать собственный компаратор.

+2

'mapa [p1] =« Manzana »;' еще короче –

+2

@Peter: 'operator []' имеет другую семантику, и я бы рекомендовал не использовать его для вставки объектов в 'map' (он вставляет новый объект если он еще не существует, то немедленно перезаписывает вновь созданный временный объект). –

+0

Wow Это была уродливая ошибка, я забыл сделать пару. Прости! Ну, теперь это работает, но это не сработало, когда я использовал char * вместо const char *. Какова сделка с const char * vs char * в этом случае? Благодаря! – ccarpenterg

6

Вот рабочее переписывание кода в вопросе:

#include <map> 
#include <string> 

class Key 
{ 
    public: 
    Key(std::string s, int i) 
    { 
     this->s = s; 
     this->i = i; 
    } 
    std::string s; 
    int i; 
    bool operator<(const Key& k) const 
    { 
     int s_cmp = this->s.compare(k.s); 
     if(s_cmp == 0) 
     { 
     return this->i < k.i; 
     } 
     return s_cmp < 0; 
    } 
}; 

int main() 
{ 


    Key p1 ("Apple", 45); 
    Key p2 ("Berry", 20); 

    std::map<Key,std::string> mapa; 

    mapa[p1] = "Manzana"; 
    mapa[p2] = "Arandano"; 

    printf("mapa[%s,%d] --> %s\n", 
    p1.s.c_str(),p1.i,mapa.begin()->second.c_str()); 
    printf("mapa[%s,%d] --> %s\n", 
    p2.s.c_str(),p2.i,(++mapa.begin())->second.c_str()); 

    return 0; 
} 
+2

Почему? как это лучше, чем OP с «парой»? – user102008

+6

Ум, потому что он компилируется и выполняется правильно? –

+0

'operator <' возможно не как preicse как std :: pairs. – Jichao

1

В качестве альтернативы тому, что сказал Джеймс McNellis:

mapa.insert(std::make_pair(p1, "Manzana")); 

вы могли бы использовать mapa.insert({p1, "Manzana"});

-1

Никогда не использовать это для решения конкурентного программирования . Потому что я считаю, что его сложность выше, чем log (n). Так что подумайте альтернативу ..

+2

На самом деле это не ответ - вы не сказали, что он ДОЛЖЕН делать – yakobom

0

Это будет делать именно то, что вы хотите

#include<bits/stdc++.h> 
using namespace std; 
int main() 
{ 
    map<pair<string, long long int>, string> MAP; 
    pair<string, long long int> P; 
    MAP.insert(pair<pair<string, long long int>, string>(pair<string, long long int>("Apple", 45), "Manzana")); 
    MAP.insert(pair<pair<string, long long int>, string>(pair<string, long long int>("Berry", 20), "Arandano")); 
    P = make_pair("Berry", 20); 
    //to find berry, 20 
    cout<<MAP[P]<<"\n"; 
    return 0; 
} 
Смежные вопросы