首页 > 解决方案 > 作为 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

标签: c++c++98

解决方案


您可能打算进行类似这样的比较:

bool operator<(MyStruct const &rhs) const
    {
        return ((unsigVar  < rhs.unsigVar)  ||
                ((unsigVar  == rhs.unsigVar) && 
                (stringVar < rhs.stringVar) ||  
                ((stringVar == rhs.stringVar) && 
                (floatVar  < rhs.floatVar))));
    }   

推荐阅读