功能,从地图

问题描述:

我有一类与map<K,V>变量,获取其值在c'tor像这样的iterator返回:bar遍历地图m功能,从地图

class Foo { 
    map<K,V> m; 
    Foo (map<K,V>& newM) : m(newM) {} 
    map<K,V>::iterator bar() { ... } 
} 

的功能,并返回的一些迭代器到某个元素。我打电话这样的功能:

std::map<K,V> map; 
//fill map 
Foo foo(map); 
map<K,V>::iterator it = foo.bar(); 

我的问题是,在这一刻,它指向的map一员?或者是否复制到Foo.m并且因此迭代器指向不同的映射?

+0

@大卫感谢,固定 – 2010-08-03 10:15:26

它将指向新的地图,当你在类的构造函数复制的映射到变量m。初始化列表中的语句m(newM)调用std::map类的复制构造函数,并将传递的映射的各个元素复制到目标映射m中。因此,当你调用bar方法时,它将从这个新地图返回迭代器。

EDIT用于存储std::map作为参考 实施例的代码:

class Foo { 
public: 
    map<int,int>& m; //Note: the change here, I am storing a reference 
    Foo (map<int,int>& newM) : m(newM) {} 
    map<int,int>::iterator bar() { return m.begin();} 
}; 


int main() 
{ 
    std::map<int,int> map1; 
    Foo foo(map1); 
    map<int,int>::iterator it = foo.bar(); 

    if(it == map1.begin()) 
    { 
     std::cout<<"Iterators are equal\n"; 
    } 
} 
+0

+1。要添加:如果这是有意的,Foo构造函数应该接受一个const引用。 – peterchen 2010-08-03 09:21:38

+0

@Naveen是否有可能以某种方式使它返回一个指向原始地图的指针 - 使用引用而不是指针? – 2010-08-03 10:21:23

+0

@Amir Rachum:是的,如果你只在类中存储引用,你可以将迭代器返回原始容器。但请注意,这是*风险*,因为您必须确保您的原始映射不会超出范围直到foo对象被销毁。否则,你最终会得到一个无效的引用,你的代码将表现出不可预测的行为。 – Naveen 2010-08-03 10:46:51

迭代器将指向您的类中包含的地图Foo。当然,这不应该成为一个问题,因为你已经将地图复制到课堂上了?

我的意思是,我想你会做这样的事情:

map<K,V> original; 
Foo foo(original); 
map<K,V>::iterator it = foo.begin(), itEnd = foo.end(); 
for (; it != itEnd; ++it) 
{ 
    // Do something with *it 
} 
+2

所有权未被转印 - 副本已经取得进展。 – 2010-08-03 09:13:37

+0

谢谢,更新了文字。 – 2010-08-03 10:12:18