2012-03-12 48 views
2

一个简单的查找功能为什么没有在关联STD容器一个“查找”功能(图,设置等)返回一个布尔值?为什么没有为关联性病容器

说:

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

我知道查找(),我也可以这样来做

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

但我觉得它杂波的代码比什么都重要。

为什么没有一个更简单的功能呢,我的意思是容器有很多关于在它们中找到的东西?

+1

像往常一样,没有什么问题downvotes但请不要告诉原因。要知道,没有教育价值没有处罚;-) – Valmond 2012-03-12 13:02:17

+4

['性病::地图:: count'(http://en.cppreference.com/w/cpp/container/map/count)会做你想要什么。 – KillianDS 2012-03-12 13:07:14

+0

足够接近作出回答(如果你发布它,我会接受它)! – Valmond 2012-03-12 13:29:40

回答

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); 
+0

是的,这将工作+1,但也会混乱一点。 – Valmond 2012-03-12 13:27:57

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的结果,并在地图上的实际节点。

+0

是的,我想过但它并非总是如此,有时我需要检查该值是否有使用前MMAP [57]包含.foo = 1;所以我不会无意中创建一个新条目。顺便说一下,你确定这样的东西现在不会被编译器优化吗? – Valmond 2012-03-12 13:26:32

+1

@Valmond - 你列举的情况正是Shahbaz所描述的情况。用'whatIWant.second.foo = 1'替换你的表达式。这将避免冗余查找。 – 2012-03-12 13:34:07

+1

有很多用例,你只是想知道它是否存在,而没有做任何其他的事情。 – visitor 2012-03-12 13:42:27

1

我相信答案是查找功能在这种情况下,2和职责,你可以使用相同的代码,以便做两个不同的东西找到,如果它存在,因此较少的代码错误少像往常一样检查。

相关问题