获取返回的multimap迭代器的内容

时间:2013-09-01 16:45:00

标签: c++ stl iterator pass-by-reference multimap

我从被调用的函数返回multimap迭代器。

代码:

std::multimap<int,std::string>::iterator it = dst.begin();

     for(int count = 0;count<3 && it !=dst.end();++it,++count)
       std::cout<<it->second<<":"<<it->first<<std::endl;

     return it;  

并且调用函数:

std::multimap<int,std::string>::const_iterator rec;
    rec= client(); 

    for(int count = 0;count<3 ;++count)
       std::cout<<rec->second<<":"<<rec->first<<std::endl; // Prints garbage values

这里为什么我无法直接打印rec的内容?在被调用的函数std::cout<<it->second<<":"<<it->first<<std::endl;中打印正确的值!

整个代码:

#include<iostream>
#include<algorithm>
#include<map>
#include<vector>

std::multimap<int,std::string>::iterator client()  
{

    std::vector<std::string> most { "lion","tiger","kangaroo",
                                     "donkey","lion","tiger",
                                     "lion","donkey","tiger"
                                     };
    std::map<std::string, int> src;
    for(auto x:most)
        ++src[x];

    std::multimap<int,std::string,std::greater<int> > dst;

    std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), 
                       [] (const std::pair<std::string,int> &p) {
                       return std::pair<int,std::string>(p.second, p.first);
                       }
                     );

    std::multimap<int,std::string>::iterator it = dst.begin();

    for(int count = 0;count<3 && it !=dst.end();++it,++count)
        std::cout<<it->second<<":"<<it->first<<std::endl;

    return it;  
}

int main()
{

    std::multimap<int,std::string>::const_iterator rec;
    rec= client(); 

    for(int count = 0;count<3 ;++count,++rec)
    std::cout<<rec->second<<":"<<rec->first<<std::endl;

}

3 个答案:

答案 0 :(得分:2)

您无法将迭代器返回到本地对象,当您从函数返回时它将变为无效并且本地对象multimap dst被销毁。你需要另一种设计,可能在免费商店上创建对象(返回共享指针?)或使其成为静态,或者像这样通过引用传递:

std::multimap<int,std::string>::iterator 
          client(std::multimap<int,std::string,std::greater<int> >& dst) {

    std::vector<std::string> most { "lion","tiger","kangaroo",
                                     "donkey","lion","tiger",
                                     "lion","donkey","tiger"
                                     };
    std::map<std::string, int> src;
    for(auto x:most)
        ++src[x];

    std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), 
                       [] (const std::pair<std::string,int> &p) {
                       return std::pair<int,std::string>(p.second, p.first);
                       }
                     );

    std::multimap<int,std::string>::iterator it = dst.begin();

     for(int count = 0;count<3 && it !=dst.end();++it,++count)
       std::cout<<it->second<<":"<<it->first<<std::endl;

     return dst.begin();  
    } 

用法:

int main(){
    std::multimap<int,std::string,std::greater<int> > dst;
    std::multimap<int,std::string>::const_iterator rec;
    rec = client(dst);

    for(int count = 0;count<3 ;++count,++rec)
       std::cout<<rec->second<<":"<<rec->first<<std::endl;

return 0;
}

注意: 也返回dst.begin()而不是it,因为否则您可能会遇到未定义的行为:它可能超出范围,因为它在client()返回之前已递增。

答案 1 :(得分:1)

从函数dst返回时,对象client的生命周期结束。此时,从映射中获取的迭代器变为无效,并且取消引用它们是未定义的行为。

答案 2 :(得分:1)

迭代器本质上是一个指针,并且您将迭代器返回到将在client调用结束时到期的局部变量。这就是你获得垃圾值的原因。