2013-06-01 3 views
0

Я создал класс со сведениями о студенте (имя и идентификатор), и я хочу использовать объект этого класса в качестве значения ключа для сопоставления. У меня есть некоторые вопросысортировка, когда объект класса используется в качестве ключа для отображения

  1. Я получаю сообщение об ошибке при компиляции этого кода. Пожалуйста, скажите мне решение для этого?

  2. Поскольку карта заказана, здесь у меня есть объект как ключевое значение, и у него есть как строка, так и число, основанные на том, какое значение ключа будет отсортировано?

  3. Я использовал

    cout<<(*ii).first<<'\t'<<(*ii).second<<endl; 
    

    напечатать значение. Это правильный способ вывести значение объекта класса

    ((*ii).first)? 
    

Просьба найти свой код ниже

#include<iostream> 
#include<map.h> 
#include<utility> 
#include<string.h> 

using namespace std; 

class A 
{ 
    private: 
    char name[10]; 
    int id_no; 
    public: 
    A(char *myname,int no):id_no(no) 
    { 
     strcpy(name,myname); 
    } 
    void output() 
    { 
     cout<<name<<'\t'<<id_no<<endl; 
    } 
};  

int main() 
{ 
    map<A,int> e; 
    A a("abc",10); 
    A b("xyz",1); 

    e.insert(pair<A,int>(a,123)); 
    e.insert(pair<A,int>(b,345)); 


    for(map<A,int>::iterator ii = e.begin(); ii!= e.end(); ii++) 
    { 
     cout<<(*ii).first<<"rank is"<<(*ii).second<<endl; 
    } 
    return 0; 
} 
+2

Какая ошибка? – Mark

ответ

2
  1. я получаю сообщение об ошибке при компиляции этого кода.

    std::map использует std::less (по умолчанию), чтобы сравнить ключи. std::less использует operator< для сравнения пройденных объектов. Таким образом, вы должны перегрузить operator< для своего класса:

    bool operator< (const A& a) 
    { 
        // compare 
    } 
    
  2. Основываясь на том, что ключевое значение упорядочиваются?

    Это будет зависеть от вашего перегруженного operator<.

  3. Это правильный способ печати значения объекта класса?

    более общий путь: вы должны перегрузить operator<< для std::ostream объекта и ваш объект класса:

    friend std::ostream& operator<< (std::ostream& stream, const A& a) 
    { 
        stream << a.name << '\t' << a.id_no << std::endl; 
        return stream; 
    } 
    

    Только тогда вы можете распечатать его, как это:

    cout << ii -> first << "rank is" << ii -> second << endl; 
    

    Без него вы должны используйте функцию output:

    ii -> first.output(); 
    cout << "rank is" << ii -> second << endl; 
    
2
#include<iostream> 
#include<map> 
#include<utility> 
#include<string> 

using namespace std; 

class A 
{ 
private: 
    string name; // there is no reason not using string here 
    int id_no; 
public: 
    A(char *myname, int no) : name(myname), id_no(no) 
    { 
    } 

    void output() 
    { 
     cout<<name<<'\t'<<id_no<<endl; 
    } 

    const string & getName() const 
    { 
     return name; 
    } 

    bool operator<(const A &right) const // A must be comparable to be used as keys 
    { 
     return name < right.name; 
    } 
};  

int main() 
{ 
    map<A,int> e; 
    A a("abc",10); 
    A b("xyz",1); 

    e.insert(pair<A,int>(a,123)); 
    e.insert(pair<A,int>(b,345)); 

    for(map<A,int>::iterator ii = e.begin(); ii!= e.end(); ii++) 
    { 
     cout<<(*ii).first.getName() << " rank is " <<(*ii).second<<endl; 
    } 
    return 0; 
} 
Смежные вопросы