2016-04-08 2 views
1

Я пытаюсь напечатать карту организованным способом. Моя карта определяется следующим образом:Как распечатать карту

map<std::string,std::vector<message *> > data; 

где сообщение является структурой, как это:

struct message{ 
    static unsigned int last_id; 
    unsigned int id; 
    std::string msg; 
    std::string timestamp; 

    message(const std::string& recvbuf_msg,const std::string& a_timestamp) : 
    msg(recvbuf_msg), timestamp(a_timestamp), id(++last_id) 
    { 
    } 
}; 

Я попробовал этот способ его печати:

std::cout << (data[username]).at(0)->msg << std::endl; 

Но это дает ошибку отладки при достижении этой функции, как я могу ее решить?

+1

Ну, * который * ошибка дает? – AnoE

+0

R6010 - abort() был вызван – 19mike95

+0

«как я могу его решить?» Вы можете использовать отладчик, чтобы найти ошибку, затем можете исправить ее. – juanchopanza

ответ

1

Ошибка R6010 - abort() has been called предполагает, что на карте нет записи для ключа username, или вектор сообщений для этого пользователя пуст. Перед доступом к элементам необходимо убедиться, что контейнеры непусты. Это хорошая идея, чтобы использовать итераторы, вот пример того, как печатать сообщения для всех имен пользователей:

for(auto mapIt = data.cbegin(); mapIt != data.cend(); ++mapIt) 
{ 
    std::cout << "printing data for " << mapIt->first << ":" << std::endl; 
    for(auto vectIter = mapIt->second.cbegin(); vectIter != mapIt->second.cend(); ++vectIter) 
    { 
     std::cout << (*vectIter)->msg << ", " << (*vectIter)->timestamp << ", " 
        << (*vectIter)->id << std::endl; 
    } 
} 

код использует auto, так что если вы не используете совместимый компилятор C++ 11, вы вам придется сами писать типы итераторов.

+0

Итак, чтобы проверить, есть ли проблема, я пишу значения на карте. Я показываю код, где я пишу на карте: 'std :: vector messages = data.at (* recvbuf_usrn); \t messages.push_back (новое сообщение (* recvbuf_msg, currentDateTime())); 'И я знаю, что recvbuf_usrn и recvbuf_msg имеют правильный contect (я проверял при отладке). – 19mike95

+0

@ 19mike95, даже если вы правильно его заполняете, безопаснее проверять, действительно ли есть элемент перед его доступом. – user463035818

+0

@ 19mike95 Это не правильный способ, что вы делаете, создавая копию вектора сообщений и добавляя к нему сообщения. Вам нужно написать прямо в вектор. Используйте это: 'data.at (* recvbuf_usrn) .push_back (новое сообщение (* recvbuf_msg, currentDateTime()));' –

Смежные вопросы