[英]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.