在以下代码中:
class Abc {
int x;
void clear() { x=0; }
}
map<string, Abc> mymap;
Abc abc1;
abc1.x = 12;
mymap[1] = abc1;
map<string, Abc>::iterator it = mymap.begin();
it->second.clear();
map<string, Abc>::iterator it2 = mymap.begin();
cout << it2->second.x; // what will this display?
假设我没有错误(地图不是空的等等),会调用清除修改存储在地图中的元素,还是副本?
我知道如果我在地图中存储Abc*
指针,就没有问题,它会打印0
,但我无法确定second
是否返回值或参考,如果我正在清除地图中的值或它的副本。
答案 0 :(得分:1)
second
是一个引用 - 您正在修改存储在地图中的元素。或者,具体而言,*it
是对地图中存储的std::pair
的引用,second
是实际元素。
答案 1 :(得分:1)
map<string, Abc> mymap;
Abc abc1;
abc1.x = 12;
mymap[1] = abc1;
编译错误:
因为密钥类型为string
,但您将1
作为密钥传递给mymap
。
cout << it2->second.x; // what will this display?
它将显示x
:0
这相当于:
Abc a;
a.x = 12;
a.clear();
cout << a.x ; //prints 0, because a.clear() made it 0!
答案 2 :(得分:0)
它将修改地图中的元素,.second不是函数,它是std :: pair结构的成员
答案 3 :(得分:0)
你为什么不试试?您可以为Abc
编写一个复制构造函数,在复制对象时打印出一条消息:
class Abc {
public:
Abc(const Abc & other)
: x(other.x)
{
std::cout << "copying" << std::endl;
}
void clear() { x=0; }
private:
int x;
}
使用此功能,您可以了解您的对象是否被复制。你应该做那样的事情来了解事情的运作方式。