【发布时间】:2011-07-31 02:28:23
【问题描述】:
我正在查看一些看起来像这样的代码
map<string, int>::iterator itr = mValue.find(inName);
他们为什么要定义一个迭代器。是不是不能说类似
int value = mValue.find(inName)
谢谢。
【问题讨论】:
我正在查看一些看起来像这样的代码
map<string, int>::iterator itr = mValue.find(inName);
他们为什么要定义一个迭代器。是不是不能说类似
int value = mValue.find(inName)
谢谢。
【问题讨论】:
您可以通过取消引用迭代器来获取值(就好像它是一个指针一样)。这将返回一个键/值对类型,它有一个成员 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;
希望这有点道理。
【讨论】:
如果地图中不存在该键会怎样?你会为find返回什么?使用迭代器,您可以返回mValue.end()。此外,迭代器允许迭代 - int 不允许。
【讨论】:
mValue.find(inName) 将迭代器返回到映射中键 inName 所在的位置。如果只想要对应的值,可以使用mValue[inName]。
【讨论】:
int value = mValue.find(inName)->second;
如果 find 没有返回 mValue.end()
【讨论】:
你可能想要使用
map<string, int>::iterator itr = mValue.find(inName);
int value = mValue[inName];
mValue[inName] = 1234;
小心,它在 const 映射上不起作用(因为它无法插入条目)
【讨论】:
他们为什么要定义一个迭代器。
因为这是 map .find() 函数返回的内容,所以它包含一个迭代器 关键和价值。或者如果未找到该值,则返回 mValue.end(),即 很有用,因为您可以测试该值是否在地图中找到。
得到你可以做的价值:
map<string, int>::iterator itr = mValue.find(inName);
if(itr != map.end()) {
int value = itr->second;
// use value
}
难道不能说 int value = mValue.find(inName)
不,std::map 没有这样的功能。 (如果确实如此,则在未找到该值的情况下必须抛出异常)
【讨论】:
operator[]),但是如果它不存在的话,它会产生额外的副作用,即在映射中插入键(这样就不得不抛出一个例外)。
原文:
因为 find 会返回该对在映射中找到键的位置。如果未找到,则返回 NULL 并因此检查
编辑:更新答案,但不删除原始内容,让其他人知道问题出在哪里以及为什么这个答案被否决。
更新答案:
因为 find 会返回该对在映射中找到键的位置。如果找不到,则返回 map.end()。
【讨论】: