簡體   English   中英

在地圖中包含地圖的結構? (C ++ / STL)

[英]Struct containing a Map in a Map? (C++/STL)

我想知道是否有可能在地圖中創建包含許多變量和地圖的結構。

我現在所擁有的:

typedef std::map<std::string,double> lawVariables;  

struct ObjectCustomData {   
  std::string objectType;    
  bool global_lock;   
  std::map<std::string, lawVariables> lawData;   
 };

然后將此結構作為該對象的單個數據塊傳遞給另一個函數。

結構設置如下:每個對象都有一個數據塊,其中包含:ObjectType,一個鎖定的bool,以及可能如下所示的不同數量的“規則”:

law1 -> var_a = 39.3;
     -> var_g = 8.1;
law8 -> var_r = 83.1;
     -> var_y = 913.3;
     -> var_a = 9.81;

首先,我不確定我是否應該在地圖中使用地圖,其次即使這是有效的,我也不確定如何填充數據以及如何在之后回憶它。 我查看了地圖,因為那時我可以搜索(在名稱上)某個對象是否有某種規律,以及該法律是否有某些變量。

(對不起第一個凌亂的帖子出現,希望這更好:))

我想知道是否有可能在地圖中創建包含許多變量和地圖的結構

是。 可以將Map作為值放在另一個映射中。

如果您特別關注插入順序並且內部地圖的條目較少,那么您的數據結構可能如下所示:

typedef std::vector<std::pair<std::string,double> > lawVariables;  

struct ObjectCustomData {   
  std::string objectType;    
  bool global_lock;   
  std::map<std::string, lawVariables> lawData;   
 };

編輯 :我現在看到你的編輯。 如果查找是您的主要要求,那么請轉到地圖。

例:

 typedef std::map<std::string,double> lawVariables;  

    struct ObjectCustomData {   
      std::string objectType;    
      bool global_lock;   
      std::map<std::string, lawVariables> lawData;   
     };

void test(ObjectCustomData& data)
{
  lawVariables& variable = data.lawData["law_1"];
  variable["var_a"] = 39.3;

}

你有什么應該工作。 您可以像這樣加載數據:

  ObjectCustomData data;
  data.lawData["law_1"]["var_a"] = 39.3;
  data.lawData["law_1"]["var_g"] = 8.1;
  data.lawData["law_8"]["var_r"] = 83.1;
  .
  .
  .

您可以檢查是否存在這樣的元素:

  if (!data.lawData.count("law_x")) {
    cout<<"law_x not found"<<endl;
  }

  if (data.lawData.count("law_1")) {
    cout<<"law_1 was found"<<endl;
  }

只需添加以下內容,其他人也可能正在尋找它:(請注意,其中一些可能會未使用,所以請隨時告訴我!:))

在.h:

typedef std::map<std::string,double> lawVariables;
typedef std::map<std::string,double>::iterator lawVars;
struct ObjectCustomData {
    std::string objectType;
    bool global_lock;
    std::map<std::string, lawVariables> lawData;
};


template <typename K, typename V, class C, class A>
std::ostream &operator<< (std::ostream &os, std::map<K,V,C,A> const& m)
{
    os << "{ ";
    typename std::map<K,V,C,A>::const_iterator p;
    for (p = m.begin(); p != m.end(); ++p) {
        os << p->first << ":" << p->second << ", ";
    }
    return os << "}";
}

注意:模板的東西是這樣你可以簡單地cout整個map-in-map。

    void setCustomData();
    void showCustomData();
    bool checkLaw(std::string law);
    bool checkVar(std::string law,std::string var);
    double getLawVar(std::string law, std::string var);
    template<class T,class A>
    void showMap(const std::map<T, A>& v);
    ObjectCustomData ocd;

注意:setCustomData只是用一些隨機數據填充map-in-map以進行測試,showCustomData只使用模板和自定義運算符來顯示整個地圖。 checkLaw和checkVar確保某個值甚至存在,並且getLawVar返回某個定律的某個值的值。 showMap顯示了map-in-map的整個內容,輸出效果更好。

在.cpp中:

我跳過了setCustomData,它只是一堆ocd.lawData [law] [var] = 123.45;

    void showCustomData() {
        std::cout <<ocd.lawData<<std::endl; 
    }
    bool checkLaw(std::string law){
        if ((int)ocd.lawData[law].size() != 0) {
            return true;
        }
        else {
            return false;
        }   
    }
    bool checkVar(std::string law, std::string var){        
        lawVars lVars = ocd.lawData[law].find(var);
        if(lVars != ocd.lawData[law].end()){
            return true;
        }
        else {
            return false;
        }
    }
    double getLawVar(std::string law, std::string var){
        if (checkLaw(law) && checkVar(law, var)){
            return ocd.lawData[law].find(var)->second;
        }
        else {return 0.0;}
    }
    template<class T, class A>
    void showMap(const std::map<T, A>& v) {
        for (std::map<T, A>::const_iterator ci = v.begin(); ci != v.end(); ++ci) {
            std::cout << ci->first <<" -> ";
            lawVariables tmpLaw = ci->second;
            lawVars lVars;
            for (lVars = tmpLaw.begin(); lVars != tmpLaw.end(); lVars++){
                std::cout << lVars->first << " : " << lVars->second <<"\t";
            }
            std::cout<<std::endl;
        }
        std::cout<<std::endl;
    }

希望這對某些人來說至少有用,可以隨意評論我能/應該做得更好的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM