c ++全局映射可用于许多对象

时间:2012-05-25 00:04:42

标签: c++ swig

我有一个类需要能够在全局stl映射对象中查找值。但是,我不希望每个类都有一个副本,因为全局对象非常大。我目前的实现是这样的:

#include obj.h
#include init.h
map <string, vector<float> > gMap;
main() {int argc, char* argv[1]) {
  gMap = init(); // function in init.h that simply creates a map and returns it
  MyObj (); 
}

在obj.h中,gMap有一个extern。

我很好奇是否有更好的方法来完成我想要的东西。想法?

我还打算通过SWIG将它导出到Python,这在当前情况下提出了一个小问题(这是重新思考这个问题的一些动机)。因此,如果任何解决方案都足够简单,可以解决SWIG中的最小问题,那将是非常好的。

谢谢!

2 个答案:

答案 0 :(得分:3)

最好的选择可能是将巨型地图存储在std :: shared_ptr(或boost :: shared_ptr)中,然后将其作为参数或成员传递给需要它的任何东西。

#include obj.h
#include init.h
#include <memory>
main() {int argc, char* argv[1]) {
  std::shared_ptr<map <string, vector<float> >> gMap; = init(); // function in init.h that simply creates a map and returns it
  MyObj f(gMap); 
}

另一种解决方案是通过引用将其传递给任何需要它的东西。但成员引用可能非常烦人。

答案 1 :(得分:0)

在C ++ 11中,您可以使用初始化列表来实现此目的。如果init函数使用一些常量值来初始化地图,那么您可以只使用此功能,而不是在init函数中创建它:

#include <map>
#include <string>
#include <vector>

std::map<std::string, std::vector<float>> gMap = {  
    {"foo", {1.5, 1.2, 6.4}},
    {"bar", {1.5, 1.2, 6.1}}
};

int main() {
    use_gmap(gMap);
}