为什么联合std容器没有更简单的查找功能

时间:2012-03-12 12:59:06

标签: c++ coding-style map set std

为什么在返回布尔值的关联std容器(map,set等)中没有'find'函数?

说:

std::map <int,int> mMap;
...
if ( mMap.contains(75) ) ...

我知道find(),我可以这样做

if ( mMap.find(75) != mMap.end() ) ...

但我觉得它比其他任何东西都更混乱了代码。

为什么没有一个更简单的功能,我的意思是容器非常关心在其中找到东西?

3 个答案:

答案 0 :(得分:3)

一个简单的原因是它没用(并且使你的效率更低)。

当你说:

时,请考虑这种方式
mMap.find(75)

您正在搜索75,但是为了什么?你想稍后再使用它!

那么为什么要写if (mMap.find(75) != mMap.end())然后再找75来使用呢?

你可以写:

std::map<int, int> mMap;
std::map<int, int>::iterator whatIWant = mMap.find(75);
if (whatIWant != mMap.end())
{
    int mapsTo = whatIWant->second;
    ...
}

这意味着您只需发出find一次,即可获得contains和地图中实际节点的结果。

答案 1 :(得分:1)

我认为答案是find函数有2个职责,在这种情况下你可以使用相同的代码来做两件不同的事情找到一些东西并检查它是否存在这样少的代码减少错误像往常一样。

答案 2 :(得分:1)

你可以制作自己的(注意,它是“HasKey”因为“包含”会处理值)

template <class AssocContainer>
bool HasKey(const AssocContainer& haystack,
    const typename AssocContainer::key_type& needle)
{
    return haystack.find(needle) != haystack.end();
}

map<int, int> m;
m[0] = 1;
bool b = HasKey(m, 0);