在存储在std :: map中的值上调用方法

时间:2011-03-11 10:31:57

标签: c++ map

在以下代码中:

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是否返回值或参考,如果我正在清除地图中的值或它的副本。

4 个答案:

答案 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;
}

使用此功能,您可以了解您的对象是否被复制。你应该做那样的事情来了解事情的运作方式。