2015-06-25 5 views
0

Я не уверен, как получить доступ к карте внутри структуры Студент Некоторые примеры, которые я ищу, говорят -> сначала -> второй , но это не скомпилировано.Как получить доступ к карте?

Как я могу получить доступ к карте внутри структуры? или перегрузка оператора неверна?

ошибка говорит ‘->’ has non-pointer type

struct Student{ 
     string id; 
     map<string, double> scores; 
    }; 


ostream& operator<<(ostream& os, const Student& g){ 
    return os << g.id << '\n' << g.scores->first << '\n' << g.scores->second ; 
} 

istream& operator >>(istream& is, Student& g){ 
    return is >> g.id >> g.scores->first >> g.scores->second; 
} 


int main() { 

    vector<Student> g_vec; 
    Student grades; 

    while(cin >> gd) 
     g_vec.push_back(grades); 

    for (auto& g : g_vec) 
     cout << g << endl; 

    } 
+0

Вы должны использовать итератор, метод, как 'find' или' [] 'для доступа к элементу вашей карты неясно, что вы пытаетесь сделать здесь. Я думаю, что вы хотите что-то вроде 'for (auto & it: g.scores) cout << it-> first << it-> second;' в методах 'ostream' и' istream' – EdChum

+0

@EdChum извините, если его неясно, в основном, что я пытаюсь сделать перегружает оператор >> и << сохраняет и выводит данные внутри структуры напрямую, моя единственная проблема - я не знаю, как получить доступ к карте STL .. Я знаю, если ее пара вы можете просто использовать .first и .second, но не уверены в карте. – XDProgrammer

ответ

1

Основное различие между . и -> является тип Objet вас есть в самом начале. Используйте ., когда у вас есть объект, и ->, когда у вас есть указатель на ваш объект

Если определить студент этого пути

Student erik = ...

Вы получите идентификатор Erik как это:

erik.id

Если определить Эрику так:

Student* erik = ...

вы получите его идентификатор, как это:

erik->id

И это то, что ошибка означает,

Но у вас есть еще одна проблема, так как first и second не определены для карты , но и для карты элемент. Вам нужно будет перебирать карту, чтобы делать то, что вы хотите. Я думаю, что-то вроде этого было бы лучше

os << g.id << '\n' 
for (auto& it : g.scores) { 
    os<< it.first << it.second << '\n' ; 
} 
+0

спасибо за ваш ответ, однако я попробовал код, который вы даете, но ошибка все еще там. или, может быть, я печатаю неправильно, это то, как я набираю его 'ostream & operator << (ostream & os, const Grades & g) { \t os << g.id << '\ n'; для (авто & it: g.баллы) { \t \t os << it-> первый << it-> второй << '\ n'; \t} \t \t возвращение os; } ' – XDProgrammer

+0

Отредактировано, позор мне, заменяя' -> '' '', исправляет его. У вашего кода есть другие проблемы, хотя, например, 'gd' undefined. –

0

Я не понял проблему. Это более сложно, если вы покажете нам образец. Извините, если я ошибаюсь, я не могу найти, когда вы перестанете читать данные. , ?

Вам нужно использовать пару для вставки в карту, и для прохождения вам следует использовать итератор. Надеюсь, что это помогает:

ostream& operator<<(ostream& os, const Student& g){ 
     //here you need to write for loop to traverse the entire map. I am printing only last ele. . 
    map<string,double>::const_iterator myit = g.scores.end(); 
    os << g.id << '\n' << myit->first << '\n' << myit->second ; 
    return os; 
} 

istream& operator >>(istream& is, Student& g){ 
    pair<string,double> mypair; 
    is >> g.id >> mypair.first >> mypair.second; 
    g.scores.insert(mypair); 
    return is; 
} 
+0

Привет, извините за непонятное объяснение моей проблемы .. но я пытаюсь сделать, это перегрузить оператор >> и <<, чтобы сохранить его в структуре, но не совсем уверен, как получить доступ к карте ... Однако это решение почти срабатывает, я думаю но в этой строке есть ошибка 'map :: const_iterator myit = g.scores.end();' он говорит «ошибка преобразования в нескалярный тип», но я меняю его на auto, файл компиляции. – XDProgrammer