float值用作multimap中的键

时间:2015-08-12 05:31:02

标签: c++ multimap

如果在float之间进行比较,我认为不能只使用等于==,需要检查是否abs(a-b)<小量。所以当float类型值用作键时,我们可以使用equal_range函数吗?

如:

std::multimap<float, string>  ds;
ds.insert(make_pair(2.0, string("a")));
ds.insert(make_pair(2.0, string("b")));
ds.insert(make_pair(3.0, string("d")));
ds.equal_range(2.0)

4 个答案:

答案 0 :(得分:3)

std::multimap::equal_range实际上并未使用operator==进行计算。它仅使用< AND >计算。它实际上是两个迭代器,第一个是std::multimap::lower_bound(第一个元素不小于给定键),第二个元素是std::multimap::upper_bound(第一个元素大于给定的密钥)。

因此使用浮动双打是非常安全的。

答案 1 :(得分:0)

只是测试它,你会发现它显然有用。

#include    <map>
#include    <string>
#include    <iostream>

int main()
{
    std::multimap<float, std::string>  ds;
    ds.emplace(2.0f, std::string("a"));
    ds.emplace(2.0f, std::string("b"));
    ds.emplace(3.0f, std::string("d"));

    auto r = ds.equal_range(2.0f);
    for ( auto it = r.first; it != r.second; ++it )
        std::cout << it->second << std::endl;
}

输出:

a
b

答案 2 :(得分:-1)

谁说你不能用==来比较两个花车? ==非常适合花车;如果它们是平等的,它将返回true,如果它们不同则返回false。 (关于NaN和负零,有一些奇怪的事情,但是范围检查没有涵盖这一点)。

显然,如果使用==在多地图中搜索任何值不相等的值,则无法找到它。如果你添加两个尽可能接近的值,它们都会被添加。

答案 3 :(得分:-1)

您可以为less定义自己的float - 运算符。请参阅以下示例。

// http://www.cplusplus.com/reference/map/multimap/

#include <map>
#include <cassert>
#include <iostream>
#include <algorithm>

class CApproxFloatLess {
    double m_eps;
public:
    CApproxFloatLess(float eps) :
    m_eps(eps)
    {
        assert(eps >= 0);
    }

    bool operator () (float x, float y) const {
        return x + m_eps*(1+std::abs(x)) < y;
    }
};

template <class It>
void info(float x, It& it) {
    std::cout << "Found pair (" << it->first << ", " << it->second << ") for " << x << ".\n";
}

int main() {
    typedef std::multimap<float,std::string,CApproxFloatLess> MyMap;
    MyMap ds(CApproxFloatLess(1e-3));

    ds.insert(make_pair(2.0, std::string("a")));
    ds.insert(make_pair(2.0, std::string("b")));
    ds.insert(make_pair(3.0, std::string("d")));


    float x=2.001;
    MyMap::iterator it=ds.find(x);
    if( it != ds.end() )
        info(x,it);

    x=1.999;
    it=ds.find(x);
    if( it != ds.end() )
        info(x,it);

    x=2.01;
    it=ds.find(x);
    if( it != ds.end() )
        info(x,it);

    x=3.001;
    it=ds.find(x);
    if( it != ds.end() )
        info(x,it);

    return 0;
}

该程序的输出是:

Found pair (2, a) for 2.001.
Found pair (2, a) for 1.999.
Found pair (3, d) for 3.001.