c++ - 作为 std::map 键的唯一结构不插入所有数据
问题描述
我正在尝试用“关键数据”填充不同的地图,然后将“关键数据”作为关键数据提取到主地图中。然而; 主地图正在跳过几个唯一条目,就好像已经存在一个密钥一样。
有人可以解释一下其余键发生了什么以及为什么它们没有插入到主地图中。
这是我用作打开主地图的键的结构。(是的,我知道我可以将 std::tie 用于运算符重载。我的项目约束是 c++98 ):
struct MyStruct
{
std::string stringVar;
unsigned unsigVar;
float floatVar;
bool operator<(MyStruct const &rhs) const
{
return ((this->unsigVar > rhs.unsigVar) ||
(this->stringVar > rhs.stringVar) ||
(this->floatVar > rhs.floatVar));
}
};
所有“关键地图”和主地图
std::map< std::string, std::vector<std::string> > stringMap;
std::map< std::string, std::vector<unsigned> > unsigMap;
std::map< std::string, std::vector<float> > floatMap;
std::map<MyStruct, int> masterMap;
获取关键数据并推入向量
std::string keys[3] = {"key1", "key2", "key3"};
std::vector<std::string> strVector;
std::vector<unsigned> unsigVector;
std::vector<float> floatVector;
strVector.push_back("str1");
strVector.push_back("str2");
unsigVector.push_back(10);
unsigVector.push_back(20);
floatVector.push_back(36.0);
floatVector.push_back(37.0);
将矢量数据存储到“关键地图”中
for (int i=0; i < sizeof(keys)/sizeof(keys[0]); i++)
{
stringMap.insert( std::make_pair(keys[i], strVector) );
unsigMap.insert( std::make_pair(keys[i], unsigVector) );
floatMap.insert( std::make_pair(keys[i], floatVector) );
}
然后我遍历所有地图并将“关键数据”插入到带有虚假数据的主地图中
// iterators for data maps
std::map< std::string, std::vector<std::string> >::iterator stringIter;
std::map< std::string, std::vector<unsigned> >::iterator unsigIter;
std::map< std::string, std::vector<float> >::iterator floatIter;
// point to first key only
stringIter = stringMap.find(keys[0]);
unsigIter = unsigMap.find(keys[0]);
floatIter = floatMap.find(keys[0]);
// loop through data maps and store into master map
for (int i=0; i < stringIter->second.size(); i++)
{
for (int j=0; j < unsigIter->second.size(); j++)
{
for (int k=0; k < floatIter->second.size(); k++)
{
// create struct to easily store into master map
MyStruct myStruct;
myStruct.stringVar = stringIter->second[i];
myStruct.unsigVar = unsigIter->second[j];
myStruct.floatVar = floatIter->second[k];
// bogus data
int data = 3;
masterMap.insert( std::make_pair(myStruct, data) );
std::map<MyStruct, int>::iterator masterIter;
masterIter = masterMap.find(myStruct);
//make sure all keys & data were inserted
if (masterIter != masterMap.end())
{
std::cout << stringIter->second[i] << "\t"
<< unsigIter->second[j] << "\t"
<< floatIter->second[k] << "\t"
<< masterIter->second <<std::endl;
}
}
}
}
这就是我得到的:
str1 10 36 3
str1 10 37 3
str1 20 37 3
str2 20 37 3
这是我期望得到的:
str1 10 36 3
str1 10 37 3
str1 20 36 3 <--- missing
str1 20 37 3
str2 10 36 3 <--- missing
str2 10 37 3 <--- missing
str2 20 36 3 <--- missing
str2 20 37 3
解决方案
您可能打算进行类似这样的比较:
bool operator<(MyStruct const &rhs) const
{
return ((unsigVar < rhs.unsigVar) ||
((unsigVar == rhs.unsigVar) &&
(stringVar < rhs.stringVar) ||
((stringVar == rhs.stringVar) &&
(floatVar < rhs.floatVar))));
}
推荐阅读
- css - CSS:根据相邻兄弟更改样式
- javascript - 在 GCharts 的 pdf 生成上替代无头浏览器
- android - 使用应用程序的android地震应用程序
- c# - 插入始终为空 ID 的实体框架
- javascript - mapStateToProps 中的 if then 语句
- forms - Xamarin Forms Button 按下事件 3 秒执行操作或不执行任何操作
- python - TypeError: element in array field Category: Can not merge type
and - android - 无法解决:Android Studio 3.1.3 中的 com.google
- smart-tv - 如何将智能电视 LG 配置为 wifi 接入点
- java - 合并 2 个具有空值的对象的数组列表