【问题标题】:Strange std::map behavior奇怪的 std::map 行为
【发布时间】:2013-06-26 19:04:42
【问题描述】:

我对来自 STL 的地图有疑问。 我有我的班级元素:

class Element {

   Element();
   uint16_t getId(void);

   private:
     uint16_t myId;

}

进入ManagerClass类我有一个std::map<uint16_t, Element> myMAP和这个方法:

void loadElement() {
   std::vector<Element> theVector = ConfigManager::getInstance().load();

   for(unsigned i = 0; i< theVector.size(); i++) {
      Element el = theVector.at(i);
      myMAP.insert(myElementPair(element.getId(), element));
   }
}

在 ManagerClass 的另一种方法中,当我浏览我的数据结构 myMAP 时发生崩溃:

void read() {

   std::map<uint16_t,Element>::iterator it;
   for(it=myMAP.begin(); it != myMAP.end(); ++it) {
      std::cout << "The ID: " << it->first << std::endl;
   }
}

我在第二个元素上发生了崩溃(myMAP 包含 2 个元素),第一个打印的 ID 值很奇怪。 你能提出什么问题吗? 当我以这种方式插入元素时,std::map 会复制元素吗?

【问题讨论】:

  • Element在实际代码中是否有动态分配的成员?因为这不会编译(unti_16t)。
  • myElementPair 看起来像什么?是像std::make_pair(element.getId(), element) 这样的东西吗?试试myMAP.insert(std::make_pair(element.getId(), element));
  • 抱歉是uint16_t!!
  • Element el = theVector.at(i); myMAP.insert(myElementPair(element.getId(), element)); 使 no 有意义。如果您想要 real 答案,请发布一些 real 代码!
  • myElementPair 是这样定义的:typedef std::pair

标签: c++ pointers std stdmap


【解决方案1】:

我知道你提供了一个 sn-p 代码,但有些东西看起来很可疑 - 为什么不试试这个呢?

void loadElement() {
  std::vector<Element> theVector = ConfigManager::getInstance().load();

  for(unsigned i = 0; i< theVector.size(); i++) {
    // Use the el local variable instead of "element"
    Element& el = theVector.at(i);
    // Use operator[] instead - does a look up and 
    // creates element automagically.
    myMAP[el.getId()] = el;
  }
}

【讨论】:

    【解决方案2】:
    for(unsigned i = 0; i< theVector.size(); i++) 
    {
       Element el = theVector.at(i);
       myMAP.insert(myElementPair(element.getId(), element));
    }
    

    我认为您的意思是插入 el,而不是 element

      myMAP.insert(myElementPair(el.getId(), el));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 2011-03-06
      • 2020-06-11
      相关资源
      最近更新 更多