0

グローバルな 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 で最小限の問題で動作するほど単純なソリューションがあれば、それは非常に良いことです。

ありがとう!

4

2 に答える 2

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

別の解決策は、それを必要とするものすべてを参照してこれを渡すことです。ただし、メンバーの参照は非常に煩わしい場合があります。

于 2012-05-25T00:24:44.323 に答える
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);
}
于 2012-05-25T01:38:06.410 に答える