2016-04-09 5 views
-2

У меня есть карта определяется как:Вне диапазона при создании вектора

map<std::string,std::vector<string> > followers 

где строка относится к имени пользователя, а вектор строк на те, что имя пользователя следующим образом. Таким образом, для добавления нового последователя, я сделал этот код:

std::vector<string> following = followers.at(recvbuf_usrn); 
following.push_back(recvbuf_usrn2); 
followers[recvbuf_usrn] = following; 

где recvbuf_usrn определяется как std::string recvbuf_usrn так recvbuf_usrn2

При отладке, я получаю сообщение об ошибке в

std::vector<string> following = followers.at(recvbuf_usrn); 

Ошибка:

Unhandled exception at at 0x779BDAD8 in Server.exe: Microsoft C++ exception: std::out_of_range at memory location 0x0018F4A0.

Я попытался сделать map<std::string,std::vector<string *> > followers, но безуспешно. Что я мог сделать? Лучше ли использовать вектор или список?

+1

Вопросы, требующие помощи по отладке («** почему этот код не работает? **») должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для его воспроизведения ** в самом вопросе ** , Вопросы без ** ясного заявления о проблеме ** не полезны для других читателей. См. [Как создать минимальный, завершенный и проверяемый пример] (http://stackoverflow.com/help/mcve). – Biffen

+0

Похоже, что 'std :: out_of_range' исходит от * карты *' at'. У 'последователей' есть запись для' recvbuf_usrn'? – Biffen

+0

Вы правы. У него не было записи. Я сделал запись для другой карты, но этот был пуст. Благодаря! – Zarauztarra

ответ

1

Объект, кажется, уже не существует в вашем векторе. at требует, чтобы он уже существовал. То, что вы, вероятно, хотите, operator[], поэтому попробуйте заменить:

std::vector<string> following = followers.at(recvbuf_usrn); 

с

std::vector<string>& following = followers[recvbuf_usrn]; 

Пожалуйста, обратите внимание, что я добавил &, потому что иначе просто работать на копию вектора, который, вероятно, не то, что вы желаете.

Также обратите внимание на комментарий Jarod42, который делает ваш код даже более компактным.

+2

'followers [recvbuf_usrn] = следующее;' затем не используется. и код может даже быть записан как 'followers [recvbuf_usrn] .push_back (recvbuf_usrn2);' – Jarod42

+0

Это решение довольно хорошо. Проблема была в том, что карта была пустой, но для того, чтобы отбросить элемент, я получал копию, отодвинул эту копию, а затем заменил ее на оригинал на карте. С этим решением я избегаю этого последнего шага. Благодаря!! – Zarauztarra