奇怪的std :: map行为

时间:2013-06-26 19:04:43

标签: c++ pointers std stdmap

我对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是否会复制元素?

2 个答案:

答案 0 :(得分:0)

我意识到你提供了一段代码,但有些东西看起来很可疑 - 为什么不试试呢?

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;
  }
}

答案 1 :(得分:0)

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));