2013-09-01 23 views
1

我從被調函數返回多圖迭代器。獲取返回的多圖迭代器的內容

代碼:

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; 

} 

回答

2

您不能將迭代器返回到本地對象,當您從函數返回並且本地對象multimap dst被銷燬時,它變爲無效。你需要另一種設計,也許在自由存儲區創建對象(返回sharedpointer?)或使其靜態的,或者類似這樣的引用傳遞:

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()之前返回之前遞增。

+0

非常感謝。如果可以解決,還有一個問題:for(int count = 0; count <3 && it!= dst.end(); ++ it,++ count) std :: cout < second <<":"< first << std: :endl;'打印前三個最常出現的單詞。我想打印所有三個最常出現的單詞。你可以請一些指導! – user123

+0

與主要問題無關。但是,如果你能回答感謝! – user123

+1

對不起; 「打印前3個最常出現的單詞,我想打印所有三個或全部出現在多重映射中的所有三個最常出現的單詞? – 4pie0

2

當您從功能client返回對象dst的壽命結束。此時,從映射中獲得的迭代器變爲無效,並且取消引用它們是未定義的行爲。

+0

解決方案?我定義了'std :: multimap > dst;'然後它給出'main'中的分段錯誤 – user123

+0

* what *?重新設計你的程序?你想解決什麼問題? –

+0

不,不需要重新設計。請糾正我錯在哪裏。我在打印'client()'函數返回的'rec'時面臨問題。那就是我想要做的。 – user123

2

一個迭代器本質上是一個指針,你將一個迭代器返回到一個局部變量,該變量將在調用結束時到期。這就是爲什麼你得到垃圾值。

+0

解決方案?我定義了'std :: multimap > dst;'然後它在主 – user123

+1

中給出了段錯誤讓'dst'' static'(假設它是一個局部變量) – 0x499602D2

+0

使它靜態刪除了錯誤:'分段錯誤' – user123