我有一个类需要能够在全局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中的最小问题,那将是非常好的。
谢谢!
答案 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);
}