免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5238 | 回复: 17
打印 上一主题 下一主题

[C++] stl容器中保存string是不是好的做法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-22 21:27 |只看该作者 |倒序浏览
比如说:  
typedef map<string, string> test_type;

test_type test_obj;
test_obj["test1"]   =  "asdfsfa";


typedef map<char *, char *> test_type;
相比性能如何?


最好就sgi.stl来说,其他实现不太清楚,多谢

论坛徽章:
0
2 [报告]
发表于 2008-04-22 22:14 |只看该作者
先别管性能,后者不一定都是正确的,因为存放的是指针,而不是字符串的内容,很多时候结果会出乎你的意料之外.希望我这么说你能明白我的意思.

论坛徽章:
0
3 [报告]
发表于 2008-04-22 22:48 |只看该作者
当然如果存储指针的话,会提供一个函数对象来实现比较功能,这样应该没有问题吧?

论坛徽章:
0
4 [报告]
发表于 2008-04-22 22:57 |只看该作者
呵呵,你没明白我说的意思.

typedef map<char *, char *> test_type;

test_type t;
t["test"] = "1";

string str = "test";

t.find((char*)str.c_str()) // 这句的结果是不可预料的....

论坛徽章:
0
5 [报告]
发表于 2008-04-22 23:26 |只看该作者
噢,我的意思是这样:
struct ltstr
{
    bool operator()(const char* s1, const char* s2) const
    {
        return strcmp(s1, s2) < 0;
    }
};
typedef map<char *, char *, ltstr> test_type;

这样应该没问题吧?
我试了一下(linux 2.6.20   gcc 4.1.2),不知道其他环境怎样,我好像一直都这么用的,没出问题,望高手明示!!!呵呵,多谢

#include <map>
#include <iostream>
#include <string.h>

using namespace std;

struct ltstr
{
    bool operator()(const char* s1, const char* s2) const
    {
        return strcmp(s1, s2) < 0;
    }
};
typedef map<char *, char *, ltstr> test_type;
int main()
{
test_type t;
t["test"] = "1";

string str = "test";

test_type::iterator iter = t.find((char*)str.c_str());
cout  << iter->first << "  " << iter->second << endl;
}

论坛徽章:
0
6 [报告]
发表于 2008-04-22 23:26 |只看该作者

回复 #5 catmonkey_lee 的帖子

恩  这样应该可以.

论坛徽章:
0
7 [报告]
发表于 2008-04-22 23:31 |只看该作者
优先用前面的吧,就像converse版主所说,在使用string导致性能成为问题时,可以考虑指针形式,但应该用智能指针,且第一个参数应该是const char*指针

论坛徽章:
0
8 [报告]
发表于 2008-04-22 23:53 |只看该作者
我刚开始看stl的源码,有点不太明白的地方:
自己看完后觉得 比如string A 放在容器中的性能应该不会损失太多的(少量数据),因为只是作了一次引用计数加一操作,这样容器中保存string B对象(我假定 string A放入容器后立马被delete,或者A是栈变量),这样的话我觉得应该和智能指针的效果是一样的.

是不是主要因为 string 占用内存空间的问题呢?

多谢 tyc611 的指点: "第一个参数应该是const char*指针"

论坛徽章:
0
9 [报告]
发表于 2008-04-23 09:36 |只看该作者
string比起char*在这个问题中的缺点仅有两个,一个是构造的时候要完全拷贝字符串,一个是string类型的占用空间比char*大,稳定性和正确性肯定是string好.

论坛徽章:
0
10 [报告]
发表于 2008-04-23 16:32 |只看该作者
但是用sizeof来看string对象的话,占用内存为4字节,和char *一样阿?
而且如果string 的拷贝构造实现基础只是引用计数加一的话,那么也不用完全拷贝字符串阿?

所以我还是觉得string可以  几乎   完全替代char *
(当然引用计数加一会涉及锁操作,是会损失效率的)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP