C++ 键在c+中不是唯一的+;地图

C++ 键在c+中不是唯一的+;地图,c++,map,c++-standard-library,C++,Map,C++ Standard Library,我的程序中有一个std::map,它存储成对的值。我希望映射中的键是唯一的——这是std::map类的预期行为。但当我把这些对插入其中时,一些键会重复。我如何解决这个问题 我的代码如下: map<float,vector<float> *> inpDataMap; inpDataMap.clear(); for(int i = 0; i < input.getNum(); i++) { float xVal = input[i][0

我的程序中有一个std::map,它存储成对的值。我希望映射中的键是唯一的——这是std::map类的预期行为。但当我把这些对插入其中时,一些键会重复。我如何解决这个问题

我的代码如下:

map<float,vector<float> *> inpDataMap;
inpDataMap.clear();
    for(int i = 0; i < input.getNum(); i++)
    {

        float xVal = input[i][0];
        float yVal = input[i][1];

        if(inpDataMap.count(xVal) > 0)
        {
            myfile << i << " repeated xval: " << xVal << " : " << yVal << endl;
            inpDataMap[xVal]->push_back(yVal);
            myfile << "repeated value pushed" << endl;
        }
        else
        {
            vector<float> *inVec = new vector<float>;
            inVec->push_back(yVal);
            inpDataMap[xVal] = inVec;
            myfile << i << " not repeated:" << xVal << ":" << yVal << endl;
        }

    }
map-inpDataMap;
inpDataMap.clear();
for(int i=0;i0)
{

myfile贴图不能包含重复的键。您可能认为这是因为浮点精度-一些对您来说看起来相等的值实际上是不同的。要解决这个问题,您可以使用自定义的
比较
类与您的贴图将足够接近的浮点视为相等:

map<float,vector<float> *, CustomCompare> inpDataMap;
map-inpDataMap;

浮点数的问题在于不能简单地使用
=
运算符来确保它们相等。例如,一个数字可能是
7.0
,但另一个数字实际上可以是
7.0000000000 15
,即使它也应该是
7.0

方法是定义一个比较这些浮点数的精度,并检查它们之间的差异是否小于精度。对于给定的示例,如果我们选择的精度为
0.000001
,这两个数字是相等的,因为
|(7.000000000015-7.0)|<0.000001.

您可以通过自己的比较器实现这种逻辑。
std::map
有一个比较器类作为其模板参数之一

更新:

事实证明,实际上没有解决映射中浮点键问题的通用方法。注释中概述的问题非常严重。映射比较器需要保证插入的键的严格弱顺序,但对于一般情况下的浮点键,它似乎不可行

假设插入3个键:a、b和c。可能
a
为假(因为它们与给定的精度相等),
b
为假(原因与
a
相同),但a和c可能彼此“相距很远”,以致
a
将返回真(它们不相等),这,这是不好的

要克服这一点,您需要对期望的键有一些了解。如果它们之间的距离足够远(距离大于通常的浮点算术错误),则可以编写适当的比较器


对于比较器示例,您可以转到存储
std::vector
而不是指向
vector
的指针如何:

map<float,vector<float> > inpDataMap;
inpDataMap.clear();
for(int i = 0; i < input.getNum(); i++)
{
    float xVal = input[i][0];
    float yVal = input[i][1];
    inpDataMap[xVal].push_back(yVal);
}
map-inpDataMap;
inpDataMap.clear();
for(int i=0;i
您如何知道密钥不是唯一的?这是不真实的,该映射包含重复的密钥。请举例说明。这是标准行为。您有责任确保不会向
std::map
添加重复的条目,如果您需要重复的密钥条目,请使用
std::multimap
。问题不在于映射,而在于您的input。映射存储唯一键很好。根据定义,键在std::map中是唯一的。你自己说。然后你说实际上它们不是唯一的。恐怕你的问题对我来说没有意义。如果你这样做,你需要非常小心,你的自定义比较正确地实现了严格的弱比较。如果你不这样做,很容易出错将“足够接近”的值创建为相等…比较器是否遵循严格的弱排序?