我有一个带有map<K,V>
变量的类,它在c'tor中得到它的值,如下所示:
class Foo {
map<K,V> m;
Foo (map<K,V>& newM) : m(newM) {}
map<K,V>::iterator bar () { ... }
}
函数bar
遍历map m
,并将一些迭代器返回给某个元素。我正在调用这样的函数:
std::map<K,V> map;
//fill map
Foo foo(map);
map<K,V>::iterator it = foo.bar();
我的问题是,此时此问题是否指向map
的成员?或者是否将其复制到Foo.m
,因此迭代器指向不同的地图?
答案 0 :(得分:2)
当您将地图复制到类的ctor中的变量m
时,它将指向新地图。初始化列表中的语句m(newM)
调用std::map
类的复制构造函数,并将传递的映射的各个元素复制到destintation映射m
。因此,当您调用bar
方法时,它将从此新映射返回迭代器。
修改强>
用于存储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";
}
}
答案 1 :(得分:0)
迭代器将指向地图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
}