读书人

简单的vector新手请问

发布时间: 2012-09-04 14:19:30 作者: rapoo

简单的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;} 

读书人网 >C++

热点推荐