c++ - 获取返回的 multimap 迭代器的内容

标签 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;

}

最佳答案

您不能将迭代器返回到本地对象,当您从函数返回时它变得无效并且本地对象 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( )

关于c++ - 获取返回的 multimap 迭代器的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18560593/

相关文章:

c# - 是否值得将一个小的 C# "engine"移植到 C++ 或类似的?

c++ - 在 C++ 中释放 vector

c++ - 在类中定义谓词

c++ - 在 C++ 模板函数中,我可以返回取消引用的参数类型吗?

c++ - 返回在 C++ 中没有 back() 方法的容器的最后一个元素?

java - ListIterator 和并发修改异常的问题

c++ - 通过引用临时传递函数的生命周期

c++ - 隐式转换以匹配运算符参数

c++ - glColor4f 设置颜色失败?

c++ - 哪些编译器选项用于在 Visual Studio 中编译 C++ STL 类/函数?