我想知道是否可以在地图中创建包含许多变量和地图的结构。
我现在所拥有的:
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;
首先,我不确定我是否应该在地图中使用地图,其次即使这是有效的,我也不确定如何填充数据以及之后如何回忆它。我查看了地图,因为那时我可以搜索(在名称上)某个对象是否具有某种规律,以及该法律是否有某些变量。
(对不起第一个杂乱的帖子出现,希望这更好:))
答案 0 :(得分:2)
我想知道是否有可能 创建一个包含多个的结构 变量和地图中的地图
是。可以将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;
}
答案 1 :(得分:1)
你有什么应该工作。您可以加载如下数据:
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;
}
答案 2 :(得分:0)
只需添加以下内容,其他人也可能正在寻找它: (请注意,其中一些可能会未使用,请随时告诉我!:))
在.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 << "}";
}
注意:模板内容非常简单,因此您可以简单地制作整个地图中的地图。
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;
}
希望这对某人来说至少有用,请随时评论我能做/应该做得更好的事情。