首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 两个关于vector的问题 [已结贴,结贴人:zhouxqwh]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhouxqwh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-20 14:25:21 楼主
    C/C++ code
    #include <iostream> #include <vector> using namespace std; class CDemo { public: CDemo:str(NULL){} ~CDemo { if(str) delete [] str; } char * str; }; int main() { CDemo d1; d2.str = new char[32]; strcpy(d1.str,"my name"); vector<CDemo> * a1 = new vector<CDemo>(); a1->push_back(d1); delete a1; //line 1 vector<int> v1(100); v1.reserve(200); v1[190] = 190; //line2 cout<<v1.size()<<endl; //line3 return 0; }


    对于以上代码,有两个问题:

    一个是line 1处的delete 语句到底需要不需要。手头的书上说是多余的,因为vector对象指针能够自动析构。可我总觉得堆区分配的对象还是应该由delete来删除。特来论坛上问下 :)

    另一个是line 2处语句会出错,而line 3处的输出还是100。搞不明白了,不是用reserve()函数重新分配了大小了吗?
    30  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • veloting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 14:31:271楼 得分:0
    你确定你这段代码能数出100?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhouxqwh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 14:31:402楼 得分:0
    不好意思,敲代码时敲了些错误。

    构造函数,析构函数后面的括号,另外还有

    d2.str = new char[32];
    中的d2应该为d1。见谅 :)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • veloting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 14:33:213楼 得分:5
    C/C++ code
    v1.resize(200);

    用resize
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • veloting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 14:36:344楼 得分:0
    貌似的确不能delete我用delete的话它会在运行时报错,应该是它已经被析构了,然后你又delete所以报了错
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • veloting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 14:37:405楼 得分:0
    可以执行的代码
    C/C++ code
    #include <iostream> #include <vector> using namespace std; class CDemo { public: CDemo():str(NULL){} ~CDemo() { if(str) delete [] str; } char * str; }; int main() { CDemo d1; d1.str = new char[32]; strcpy(d1.str,"my name"); vector<CDemo> * a1 = new vector<CDemo>(); a1->push_back(d1); vector<int> v1(100); v1.resize(200); v1[190] = 190;//line2 cout<<v1.size()<<endl; //line3 system("pause"); return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • pengzhixi
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 14:39:416楼 得分:0
    引用 3 楼 veloting 的回复:
    C/C++ code
    v1.resize(200); 


    用resize
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • veloting
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 14:40:327楼 得分:0
    C/C++ code
    #include <iostream> #include <vector> using namespace std; class CDemo { public: CDemo():str(NULL){} ~CDemo() { if(str) delete [] str; } char * str; }; int main() { CDemo d1; d1.str = new char[32]; strcpy(d1.str,"my name"); vector<CDemo> * a1 = new vector<CDemo>(); a1->push_back(d1); vector<int> v1(100); v1.resize(200); v1.reserve(300);//这个是最小容量 v1[190] = 190;//line2 cout<<v1.size()<<v1.capacity()<<endl; //line3,size表示已经用的,capacity表示可以接受的 system("pause"); return 0; }

    不知道你会不会看出区别在哪里
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • taojian_hhu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 14:45:168楼 得分:10
    v1.reserve(200);只是表明v1可以存放200个元素,但是其size还是没有变。
    所以要用resize。
    对于一个vector对象来说,为了保证其存取的效率,都为其预留了一部分的空间,这样当push_back的时候不需要
    再分配空间,这样就提高了效率。
    如假设v1当前有10个元素,它的capacity为200,那么它的size为10,但是它可以继续push_back 190个元素而不需要另外分配空间
    当要push_back 大于190个元素时,该容器才另外分配空间。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhouxqwh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 16:00:549楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wjb_yd
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 20:58:3710楼 得分:0
    1.需要
    2.见8楼
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yshuise
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 21:26:2411楼 得分:10
    肯定要,楼主,你的程序有bug,修改如下:
    C/C++ code
    #include <cstdlib> [code=C/C++]#include <iostream> #include <vector> using namespace std; class CDemo { public: CDemo():str(NULL){} ~CDemo(){if(str) delete [] str;} char * str; }; int main(int argc, char *argv[]) { CDemo d1; d1.str = new char[32]; strcpy(d1.str,"my name"); vector<CDemo> * a1 = new vector<CDemo>(); a1->push_back(d1); delete a1; system("PAUSE"); return EXIT_SUCCESS; }


    这段程序设计有问题,请看我的设计:
    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <vector>

    class CDemo
    {
    public:
    typedef std::vector <std::string> Str;
    CDemo(){}
    void push(const std::string& a){cstr.push_back(a);}
    ~CDemo(){}
    private:
    Str cstr;
    };

    int main(int argc, char *argv[])

        CDemo cd;
        cd.push("god is girl");
        system("PAUSE");
        return EXIT_SUCCESS;
    }[/code]
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yshuise
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 21:26:3412楼 得分:0
    肯定要,楼主,你的程序有bug,修改如下:
    C/C++ code
    #include <cstdlib> [code=C/C++]#include <iostream> #include <vector> using namespace std; class CDemo { public: CDemo():str(NULL){} ~CDemo(){if(str) delete [] str;} char * str; }; int main(int argc, char *argv[]) { CDemo d1; d1.str = new char[32]; strcpy(d1.str,"my name"); vector<CDemo> * a1 = new vector<CDemo>(); a1->push_back(d1); delete a1; system("PAUSE"); return EXIT_SUCCESS; }


    这段程序设计有问题,请看我的设计:
    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <vector>

    class CDemo
    {
    public:
    typedef std::vector <std::string> Str;
    CDemo(){}
    void push(const std::string& a){cstr.push_back(a);}
    ~CDemo(){}
    private:
    Str cstr;
    };

    int main(int argc, char *argv[])

        CDemo cd;
        cd.push("god is girl");
        system("PAUSE");
        return EXIT_SUCCESS;
    }[/code]
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sxqlyy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 13:52:0013楼 得分:5
    引用楼主 zhouxqwh 的帖子:
    C/C++ code
    #include <iostream>
    #include <vector>
    using namespace std;

    class CDemo
    {
    public:
    CDemo:str(NULL){}
    ~CDemo
    {
    if(str) delete [] str;
    }
    char * str;
    };

    int main()
    {
    CDemo d1;
    d2.str = new char[32];
    strcpy(d1.str,"my name");
    vector <CDemo> * a1 = new vector <CDemo>();
    a1->push_back(d1);
    delete a1;          //line 1

    vector <int> v1(100);
    v1.reserve(200);
    v1[190] …


    new了肯定要delete的
    会出错是因为CDemo 没有重写拷贝构造函数
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Longinc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 14:24:2414楼 得分:0
    改为v1.resize(200);
    我VC6.0下用delete a1时内存崩溃,应该是不需要用
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved