【问题标题】:How to print a map如何打印地图
【发布时间】:2016-04-08 09:38:16
【问题描述】:

我正在尝试以有组织的方式打印地图。我的地图是这样定义的:

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

其中 message 是这样的结构:

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;

但是在到达该功能时它会出现调试错误,我该如何解决?

【问题讨论】:

  • 好吧,它给出了哪个错误?
  • R6010 - abort() 已被调用
  • “我该如何解决?”您可以使用调试器找到错误,然后您可以修复它。
  • 我使用调试器发现错误在那个 cout 上。
  • 然后使用调试器检查(data[username]).at(0)-&gt;msg 是否有效,然后再计算它

标签: c++ dictionary printing cout


【解决方案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 的编译器,则必须自己编写迭代器类型。

【讨论】:

  • 好的,所以要检查问题是否是我在地图中写入了值,我显示了我在地图中写入的代码:std::vector&lt;message *&gt; messages = data.at(*recvbuf_usrn); messages.push_back(new message(*recvbuf_msg,currentDateTime())); 我知道 recvbuf_usrn 和 recvbuf_msg 有正确的联系(我在调试时检查过)。
  • @19mike95 即使你填写正确,在访问它之前检查是否真的有一个元素会更安全。
  • @19mike95 这不是正确的方法,您正在做的是创建消息向量的副本并向其中添加消息。您需要直接写入向量。使用这个:data.at(*recvbuf_usrn).push_back(new message(*recvbuf_msg,currentDateTime()));
猜你喜欢
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 2011-04-13
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
相关资源
最近更新 更多