2011-04-06 129 views
1

我找了一些代码,看起来像这样迭代器上的C++映射?

map<string, int>::iterator itr = mValue.find(inName); 

他们为什么要定义一个迭代器。是不是可以这样说

int value = mValue.find(inName) 

谢谢。

+0

也许upvote一些答案 – 2011-04-06 19:03:07

回答

1
int value = mValue.find(inName)->second; 

提供发现没有返回mValue.end()

5

如果该键不存在于地图存在,会发生什么?你会为find返回什么?使用迭代器,您可以返回mValue.end()。另外,迭代器允许迭代 - int不能。

2

mValue.find(inName)将迭代器返回到地图中位置为inName的位置。如果您只需要相应的值,则可以使用mValue[inName]

+1

这是非常量,但会创建一个映射条目,如果它不存在。 (并不是说原始代码在没有价值的情况下没有那么惨重)。 – 2011-04-06 19:03:49

14

您可以通过取消引用迭代器来获取值(就像它是一个指针一样)。这将返回一个密钥/值对的类型,其具有的值是一个构件second

map<string, int>::iterator itr = mValue.find(inName); 
int value = itr->second; 

返回一个迭代器的原因是因为当一个匹配找不到则返回end()迭代:

map<string, int>::iterator itr = mValue.find(inName); 
if (itr == mValue.end()) 
{ 
    throw "No value could be found."; 
} 

int value = itr->second; 

希望这是有道理的。

+0

+1对解引用迭代器的明确说明 – 2013-08-02 23:21:29

-2

原因:

因为find会在映射中返回找到该键的位置。如果没有找到,它会返回NULL,因此检查

编辑:更新答案,但不删除原始内容,让其他人知道什么是错的,以及为什么这个答案是downvoted。

更新答:

因为发现返回对在关键是找到地图的位置。如果找不到,则返回map.end()。

+0

未找到时不会重新生成NULL。所以-1错误的答案。 – Sjoerd 2011-04-06 19:05:03

+0

借调在最初downvote后不删除答案。 – phooji 2011-04-06 19:44:36

+0

@ phooji:每个人都不可能一直上网。如果您觉得自己想要退缩只是因为该人没有删除答案,您可以自由选择。 – mukeshkumar 2011-04-07 09:11:29

1

你可能想使用

map<string, int>::iterator itr = mValue.find(inName); 
int value = mValue[inName]; 

mValue[inName] = 1234; 

照顾,也不会一个const地图上工作(因为它将无法插入条目)

1

他们为什么定义一个迭代器。

,因为这是在map .find()函数返回时,包含 键和值迭代器。或者,如果找不到该值,则返回mValue.end(),因为您可以测试该值是否在地图中找到,所以它很有用。

,让你可以做的值:

map<string, int>::iterator itr = mValue.find(inName); 
if(itr != map.end()) { 
    int value = itr->second; 
    // use value 
} 

是没可能说类似int值= mValue.find(inName)

不,的std ::地图没有这样的功能。 (如果是这样,它将不得不抛出一个例外,如果没有找到该值)

+0

它确实有这样一个函数('operator []'),但是如果它还不存在的话(它不得不抛出异常),它会在映射中插入键的附加副作用。 – dfan 2011-04-06 19:56:02