Просто добавьте следующее, если кто-то другой может его искать:
(обратите внимание, что некоторые из них могут остаться неиспользованными или около того, дайте мне знать! :))
в .ч:
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 << "}";
}
Примечание: шаблонные материалы таковы, что вы можете просто отслеживать всю карту в карте.
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 просто заполняет карту карты некоторыми случайными данными для целей тестирования, 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;
}
Надеюсь, это хотя бы несколько полезно для кого-то, не стесняйтесь комментировать вещи, которые я мог бы / должен сделать лучше.