2

我从被调用函数返回多映射迭代器。

代码:

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;

}
4

3 回答 3

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;
}

注意:也 return dst.begin()not it,否则您可能会遇到未定义的行为:它可能会指出超出范围,因为它在 return in 之前增加了client()

于 2013-09-01T17:02:50.763 回答
1

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

于 2013-09-01T16:49:29.160 回答
1

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

于 2013-09-01T16:47:58.477 回答