简单的vector,新手请教
- C/C++ code
#include<iostream>#include<vector>#include<string>using namespace std;class A{ public: string data; A(){data="";} A(string d):data(d){} void set(string d){data=d;} void show(){cout<<"data="<<data<<endl;}};//这里为了方便在函数里操作,我直接把容器定义成全局变量,不知道这样写是否非主流,球调教vector<A>vt;//填充数据的函数A Create(){ string data; cout<<"请输入一个数据"<<endl; cin>>data; A tmp(data); return tmp;}//查找函数A& find(){ string i; cout<<"你想查找哪个数据?"<<endl; cin>>i; if(vt.empty()) { cout<<"没有这个数据!"<<endl; A tmp;//这里返回一个局部变量,在main里我定义result来接这个tmp,但隐约记得有人说过不要返回一个局部变量云云... return tmp; } else { vector<A>::iterator iter=vt.begin(); while(iter!=vt.end()) { if((*iter).data==i) break; else iter++; } if(iter==vt.end()) { cout<<"没有这个数据!"<<endl; A tmp; return tmp; } else { cout<<"找到这个数据"<<endl; (*iter).show(); return *iter; } }}int main(){ int count=0; bool flag; //填充数据 do { A tmp; tmp=Create(); vt.push_back(tmp); count++; cout<<"是否继续输入?(1/0)"<<endl; cin>>flag; }while(count<=100 && flag); vector<A>::iterator iter=vt.begin(); //输出 for(;iter!=vt.end();iter++) (*iter).show(); //查找 A result; while(1) { result=find();//用个result来接find()返回的局部变量 //这里我是想看一下局部变量传递出来后的效果,发现找不到的话是个随机数 cout<<"此时result.data="<<result.data<<endl; } return 0;}
有一个问题就是find()函数里
- C/C++ code
if(iter==vt.end()) { cout<<"没有这个数据!"<<endl; A tmp; return tmp; }
我的想法:在找不到数据的时候,必须返回一个A& 类型的值,所以在这里返回一个局部变量,然后在main里定义个result来接,在这里"A tmp"就相当于给里面的data赋值了,默认构造函数里的A(),但每次运行到查找不到数据时,就会说要关闭程序,而如果我改成A tmp(100)或随便一个数的时候,就没有提示要关闭程序,修改后的操作不是也同样是调用构造函数吗?
再请教一下各位大大在写这些函数的时候,返回局部变量时会有什么毛病?
[解决办法]
永远不要返回一个局部变量的引用或者指针
因为当一个局部变量的生命周期结束时,将会释放掉变量所占用的空间,而你返回出去的引用、指针依然指向那个地址,如果那个地址被其他对象使用,将导致你的引用、指针的值没有任何意义(随机值)
对于楼主要实现的查找功能,可以返回vt.end(),很多查找函数失败时返回的都是这个,指的是vector末尾元素的下一个元素
[解决办法]
简单的改了下代码,避免了局部变量的返回。虽然我觉得楼主只是想试试返回局部变量的结果,不过我比较无聊就是……
- C/C++ code
#include<iostream>#include<vector>#include<string>using namespace std;class A{ public: string data; A(){data="";} A(string d):data(d){} void set(string d){data=d;} void show(){cout<<"data="<<data<<endl;}};//这里为了方便在函数里操作,我直接把容器定义成全局变量,不知道这样写是否非主流,球调教vector<A>vt;//填充数据的函数A Create(){ string data; cout<<"请输入一个数据"<<endl; cin>>data; A tmp(data); return tmp;}//查找函数vector<A>::iterator find(){ vector<A>::iterator iter=vt.begin(); string i; cout<<"你想查找哪个数据?"<<endl; cin>>i; if(vt.empty()) { cout<<"没有这个数据!"<<endl; return iter; } else { while(iter!=vt.end()) { if((*iter).data==i) break; else iter++; } if(iter==vt.end()) { cout<<"没有这个数据!"<<endl; return iter; } else { cout<<"找到这个数据"<<endl; (*iter).show(); return iter; } }}int main(){ int count=0; bool flag; //填充数据 do { A tmp; tmp=Create(); vt.push_back(tmp); count++; cout<<"是否继续输入?(1/0)"<<endl; cin>>flag; }while(count<=100 && flag); vector<A>::iterator iter=vt.begin(); //输出 for(;iter!=vt.end();iter++) (*iter).show(); //查找 while(1) { iter=find();//用个result来接find()返回的局部变量 //这里我是想看一下局部变量传递出来后的效果,发现找不到的话是个随机数 if(iter != vt.end()) cout<<"此时data="<<(*iter).data<<endl; } return 0;}