矢量c ++的Unordered_map

时间:2014-04-18 11:23:33

标签: c++ vector unordered-map

我现在想要几个小时才能做到这一点。我想要做的是有一个存储在未命名的命名空间中的向量映射(向量包含指向对象的指针)。然后允许类通过函数调用访问向量中的数据。

//DataHandler.cpp

#include "DataHandler.h"

using std::vector;
using std::unordered_map;

namespace DataHandler
{
  namespace
  {
    unordered_map< unsigned int, vector<MyClass*> > data_map_;
  }

  void receiveData(unsigned int key, vector< MyClass*>& data_vec)
  {
    //check if key already exists:
    unordered_map<unsigned int, vector<MyClass*> >::iterator it;

    it = data_map_.find(key);
    if (it != data_map_.end())
    {
      data_vec = it->second;
      return;
    }

    //generate new key with new data
    data_map_.insert(make_pair(key, vector< MyClass*>()));

    data_map_[key].push_back(new MyClass(/*some constructor arguments*/));
    // ... push back some more instances of MyClass ...

    //finally:
    data_vec = data_map_[key];
    return;
  }
}

在其他一些课程中,我这样做是为了获得矢量:

//SomeOtherClass.cpp

#include "SomeOtherClass.h"
#include "DataHandler.h"

using std::vector;

void SomeOtherClass::aMethod()
{
  vector<MyClass*> first;
  vector<MyClass*> second;
  vector<MyClass*> first_again;

  DataHandler::receiveData(1, first); //works fine
  DataHandler::receiveData(2, second); //works fine
  DataHandler::receiveData(1, first_again); // <- strange behavior or segfault here
}

所以一切都按预期工作,除非我想访问之前填充了MyClass实例的向量 - 然后我得到奇怪的行为或分段错误。 有人可以向我解释为什么会这样,以及如何做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:0)

我看不出任何具体问题,所以这不是一个答案,但对于评论来说太长了。我将它标记为社区维基。无论如何,为什么没有std::unordered_map<unsigned, std::vector<MyClass>>并摆脱所有的指针和终身问题? SomeOtherClass::aMethod()可以执行insert,返回std::pair<iterator,bool> - 如果您希望稍后在MyClass中访问aMethod元素,请保存该迭代器。就像,如果你在first_again中有一些指针,它们会在receiveData()内被first中的任何指针所破坏:有很多方法可能是内存泄漏,但我如果没有看到更多的代码,就无法肯定地说。