从地图返回迭代器的函数

时间:2010-08-03 09:07:43

标签: c++ map std

我有一个带有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,因此迭代器指向不同的地图?

2 个答案:

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