2011-03-11 42 views
0

在下面的代码的方法:调用存储在一个std值::地图

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是否返回值或引用,并且如果我正在清除值这是在地图或它的副本。

回答

1

second是一个参考 - 您正在修改存储在地图的元素。或者,具体而言,*it是存储在地图中的std::pair的引用,second是实际的元件。

+1

我想这是迭代器的目的是允许这样做,对不对? (为什么在某些时候,函数就会返回到一个非C++程序员会预期一个迭代的原因领取“结果”)。是否有一个地方,我们只读迭代器,是有办法告诉任何情况下,如此通过查看的std :: *文档(例如常量性)? – PypeBros 2011-03-11 10:41:38

+0

@sylvainulg:关于第二个问题,没有。当你想要访问相邻元素时返回一个迭代器;如果您想要修改结果,则会返回对结果的引用。 – MSalters 2011-03-11 10:43:42

+0

@sylvainulg:如果迭代器在文档中被归类为“输入迭代器”,则不能分配其内容。例如。 istream_iterator用于从流中提取值。当然,这是对const_iterator版本的补充。 – Erik 2011-03-11 10:49:07

0

它会修改地图元素,。第二个是不是它是一个功能一个std ::对结构

0

的成员,你为什么不只是尝试?你可以写一个Abc拷贝构造函数,当对象被复制打印出一条消息:

class Abc { 
public: 
    Abc(const Abc & other) 
    : x(other.x) 
    { 
     std::cout << "copying" << std::endl; 
    } 
    void clear() { x=0; } 
private: 
    int x; 
} 

利用这一点,你可以找到你要的对象是得到复制。你应该这样做,以了解事情的工作方式。

1
map<string, Abc> mymap; 
Abc abc1; 
abc1.x = 12; 
mymap[1] = abc1; 

编译错误:

由于密钥类型为string,但你传递1mymap关键。

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! 
+0

此外,'clear'方法是私有的。 – 2011-03-11 10:38:43

+0

是啊........... – Nawaz 2011-03-11 10:41:09