C++ std::unordered_map

C++ std::unordered_map

本文关键字:map unordered C++ std      更新时间:2023-10-16

我正在使用std::unordered_map,我想用它来存储指向我用new动态创建的对象的指针。

我可以很好地创建对象并且插入方法成功;然而,当我尝试使用索引从映射中解析特定对象时,似乎列表中的所有项都映射到我在映射中指向的最后一个项。

typedef std::unordered_map<__int64, Session*> HashDict;
HashDict dict;
void Sessions::Insert()
{
  Session* newSession = new Session;
  newSession->setId(sessionCounter++);
  dict.insert(HashDict::value_type(newSession->Id(), newSession));
}
void Sessions::Find(__int64 id)
{
  HashDict::iterator it = dict.find(id);
  if(it != dict.end())
  {
    Session* s = it->second;
    std::cout << "Search for: " << id << std::setw(3) << 
                 " found @ location: "  << it->second << std::setw(3) << 
                 " with value: " <<  s->Id() << std::endl;
  }
}
001D4F50    0
001D5038    1
001D50D0    2
001D5378    3
001D5410    4
001D54A8    5
001D5540    6
001D55D8    7
001D5670    8
001D4E50    9
Search for: 5 found @ location: 001D54A8 with value: 9

注意,5指向5的位置(从插入),但是它说值是9

我做错了什么?

如果我不得不从你得到的输出猜测,由任何机会是会话标记静态的ID字段?如果是这样,这就会表现为你在这里看到的行为。特别是,如果该字段是静态的,那么每次创建和更新新会话的ID时,您将覆盖跨所有session对象共享的ID字段,并且只有最后一个session ID将保留。

如果我完全错了,让我知道,我会删除这个答案。