| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4710 人关注过本帖, 1 人收藏
标题:求教一个vector<string>指针问题
只看楼主 加入收藏
dong820729
Rank: 2
等 级:论坛游民
帖 子:11
专家分:29
注 册:2009-12-21
结帖率:50%
收藏(1)
已结贴  问题点数:20 回复次数:11 
求教一个vector<string>指针问题
该题目为c++primer的习题:编写程序定义一个vector对象,其每个元素都是指向string类型的指针,读取该vector对象,输出每个string的内容及其相应的长度。

我的程序如下:

#include<iostream>
#include<string>
#include<vector>
#pragma warning(disable:4786)
using namespace std;
int main()
{
    string str;
    vector<string*> psvec;//为何这里用string*类型,不能用vector<string>*呢?
    while(cin>>str)
    {
        string *ps=new string;//为何这里要动态创建string,不能直接psvec->push_back(str)?
        *ps=str;//这里为何用*ps=str,不能使用ps=&str?
        psvec.push_back(ps);/*在这里我们把ps给psvec,那么psvec保存的应该是string*类型,
                              下面的for循环显然使用了该类型的begin(),end()操作,
                              为什么可以这样用?*/
    }
    for(vector<string*>::iterator iter=psvec.begin();iter!=psvec.end();++iter)
    {
        cout<<**iter<<" "<<(*iter)->size()<<endl;
        delete *iter;/*1.为何要释放*iter?
                       2.为何不是释放iter?
                       3.我们动态创建的是ps,为何不是释放ps?
                       4.我在网上找的答案是在这个for循环外另起一个同样的循环释放*iter,我在这里释放有何不可?
                         我在这里释放,编译也可通过,为何?*/
    }
    return 0;
}


此题给我的问题颇多,希望各位大神能给出详细解答!
先行谢过!
搜索更多相关主题的帖子: string 指针 vector 
2010-03-01 16:24
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:10 
是否正确,望高手斧正!
#include<iostream>
#include<string>
#include<vector>
#pragma warning(disable:4786)
using namespace std;
int main()
{
    string str;
    vector<string*> psvec;//vector<T> T是类型,而vector<T>*是指向一个vector的指针
    while(cin>>str)
    {
        string *ps=new string;//str不是string*类型,同时str的地址是不变的
        *ps=str;//*ps=str,ps=&str你认为它们是一样的吗?
        psvec.push_back(ps);/*在这里我们把ps给psvec,那么psvec保存的应该是string*类型,
                              下面的for循环显然使用了该类型的begin(),end()操作,
                              但begin(),end()返回的不是string* 而是string**  */
    }
    for(vector<string*>::iterator iter=psvec.begin();iter!=psvec.end();++iter)
    {
        cout<<**iter<<" "<<(*iter)->size()<<endl;
        delete *iter;/*  *iter就是ps  再用一个循环释放与这个没有本质差别*/
    }
    return 0;
}

★★★★★为人民服务★★★★★
2010-03-02 07:47
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:2 
实际上你可以用vector<string>来处理这个问题,不必用vector<string*>

#include<iostream>
#include<string>
#include<vector>
#pragma warning(disable:4786)
using namespace std;
int main()
{
    string str;
    vector<string> psvec;
    while(cin>>str)
    {
        psvec.push_back(str);
    }
    for(vector<string>::iterator iter=psvec.begin();iter!=psvec.end();++iter)
    {
        cout<<*iter<<" "<<iter->size()<<endl;
    }
    return 0;
}

[ 本帖最后由 cnfarer 于 2010-3-2 08:03 编辑 ]

★★★★★为人民服务★★★★★
2010-03-02 07:58
dong820729
Rank: 2
等 级:论坛游民
帖 子:11
专家分:29
注 册:2009-12-21
收藏
得分:0 
还有些疑惑:ps在这里应该是一个string类型的动态指针,那么*ps=str表示对ps解引用操作保存的是str的值,而ps=&str表示ps保存的是str的地址,那么对ps进行解引用应该也是得到的str的值啊。所以我不明白,为什么只能用*ps=str而不能使用ps=&str。事实上,我试过把*ps=str改成ps=&str,确实出现一堆错误,请问这两者有何区别,谢谢!
2010-03-02 09:12
秀痘魔导士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:250
专家分:1150
注 册:2009-12-23
收藏
得分:1 
以下是引用dong820729在2010-3-2 09:12:19的发言:

还有些疑惑:ps在这里应该是一个string类型的动态指针,那么*ps=str表示对ps解引用操作保存的是str的值,而ps=&str表示ps保存的是str的地址,那么对ps进行解引用应该也是得到的str的值啊。所以我不明白,为什么只能用 ...
编译成功,没有问题
2010-03-02 11:26
秀痘魔导士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:250
专家分:1150
注 册:2009-12-23
收藏
得分:1 
以下是引用cnfarer在2010-3-2 07:47:58的发言:

是否正确,望高手斧正!
#include<iostream>
#include<string>
#include<vector>
#pragma warning(disable:4786)
using namespace std;
int main()
{
    string str;
    vector<string*> psvec;//vector<T>  ...
delete *iter这边不对,*iter是string的指针。
2010-03-02 11:27
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:3 
回复 4楼 dong820729
*ps=str是赋值(将str的内容复制到ps所指向的地址空间)!而ps=&str是改变了ps指向的内存空间的地址,不再是申请到地址了,而是str的地址!

★★★★★为人民服务★★★★★
2010-03-02 14:13
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:1 
而string本身就应该是个指针,所以ps=&str以后,肯定要出错的

★★★★★为人民服务★★★★★
2010-03-02 14:21
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
回复 6楼 秀痘魔导士
你可以delete **iter啊

★★★★★为人民服务★★★★★
2010-03-02 14:24
秀痘魔导士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:250
专家分:1150
注 册:2009-12-23
收藏
得分:0 
以下是引用cnfarer在2010-3-2 14:24:47的发言:

你可以delete **iter啊
刚开始没仔细看,你写的没什么问题。我刚开始是看成了*iter你指代str的~

[ 本帖最后由 秀痘魔导士 于 2010-3-2 14:34 编辑 ]
2010-03-02 14:29
快速回复:求教一个vector<string>指针问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017894 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved