在http://www.cplusplus.com/reference/map/map/insert/中,我对执行ret.first->second或it->second访问第二个值的理由感到困惑。如果你只需要用.first->second,为什么要做->second?
// map::insert (C++98)
#include <iostream>
#include <map>
int main ()
{
std::map<char,int> mymap;
std::pair<std::map<char,int>::iterator,bool> ret;
ret = mymap.insert ( std::pair<char,int>('z',500) );
if (ret.second==false) {
std::cout << "element 'z' already existed";
std::cout << " with a value of " << ret.first->second << '\n';
}
// showing contents:
std::cout << "mymap contains:\n";
for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)
std::cout << it->first << " => " << it->second << '\n';
return 0;
}发布于 2020-03-19 23:21:57
每个std::map元素都存储为包含其键和值的std::pair (分别在对的first和second字段中)。
std::map::insert()方法返回包含以下内容的std::pair:
指向正在插入的键的std::map.元素的std::map::iterator。
bool当代码调用ret = mymap.insert(...);时,ret.first是iterator,ret.second是bool。
删除std::map::iterator访问迭代器所指向的元素的键/值std::pair。
因此,由于ret.first是std::map::iterator,那么ret.first->first是元素的键,ret.first->second是元素的值。
在后续的循环中,for (it=mymap.begin(); it!=mymap.end(); ++it),it也是一个std::map::iterator,在每个循环迭代中指向std::map的一个不同元素。因此,当取消引用该迭代器时,it->first是元素的键,it->second是元素的值。
发布于 2020-03-19 23:20:30
变量ret被声明为类模板std::偶数的对象。
std::pair<std::map<char,int>::iterator,bool> ret;要在对象中获得迭代器,必须编写
ret.first例如,
std::map<char, int>::iterator it = ret.first;现在,要使用迭代器获得映射的值,必须编写表达式。
it->second所以用它来代替它的价值
ret.first->second在这个循环中
for (it=mymap.begin(); it!=mymap.end(); ++it)
std::cout << it->first << " => " << it->second << '\n'已经使用了一个迭代器,该迭代器没有包装在类模板std::结对的对象中。
发布于 2020-03-19 23:23:15
这是两件不同的事情。
it时,需要执行it->second来(a)取消引用,(b)获取结果对的“第二个”项,即映射值。insert (ret)的结果是两件事:迭代器和bool,告诉您插入是否真的发生了。您需要ret.first来获得迭代器,然后应用上面的逻辑.换句话说,ret.first就像it。所以,ret.first->second就像it->second。
这确实有点令人困惑,因为使用的是pair,而不是带有描述性成员名的类型,如iterator/wasInserted和key/value。
在另一个宇宙中,cplusplus.com的代码看起来更像这样:
#include <iostream>
#include <map>
int main()
{
std::map<char, int> mymap;
MapInsertionResult ret = mymap.insert(std::pair<char, int>('z',500));
if (ret.performedInsertion == false)
{
std::cout << "element 'z' already existed";
std::cout << " with a value of " << ret.it->value << '\n';
}
// showing contents:
std::cout << "mymap contains:\n";
for (auto it = mymap.begin(); it != mymap.end(); ++it)
{
std::cout << it->key << " => " << it->value << '\n';
}
}不幸的是,我们没有生活在其中。
顺便说一句,如果您可以使用mymap.emplace('z', 500),那么insert调用比C++11+要短。
https://stackoverflow.com/questions/60766336
复制相似问题