我从被调用的函数返回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;
}
答案 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
调用结束时到期的局部变量。这就是你获得垃圾值的原因。