请教个multimap容器的基础问题

blueboy82006 2012-02-29 08:46:38

multimap和map默认都是以 键值 的 < 操作进行排序插入的。
下述代码本意是让key值按字符串比较大小,再插入相应的结点。



multimap<char*,int> testmap;

char s1[10]="de3456789";
char s2[5]="abcd";
char* p=s1;

testmap.insert(make_pair(s1,12));
testmap.insert(make_pair(s2,17));
testmap.insert(make_pair(p,8));



(问题1:)但实际是比较了字符串地址的大小了吧?因为multimap<char*,int>的key是一个字符指针。不知道是不是这样子?

另外,如果是下面这样:



multimap<string,int> testmap;

char s1[10]="de3456789";
char s2[5]="abcd";

string str1(s1),str2(s2);
testmap.insert(make_pair(str1,12));
testmap.insert(make_pair(str2,17));




(问题2:)容器是否是按string值来进行 < 的比较,再insert?

(问题3:)这种情况testmap需要格外开辟空间来存放string值吗?还是直接string的地址空间?


谢谢~
...全文
45 点赞 收藏 5
写回复
5 条回复
blueboy82006 2012年02月29日
ok, 自己实现了,分享一个。
由于考虑string拷贝的问题。我这里只能用char*
自己实现了一下比较函数。

struct ltstr
{
bool operator()(const char* s1, const char* s2) const
{
return strcmp(s1, s2) < 0;
}
};

multimap<const char*, int, ltstr> testmap;


回复 点赞
blueboy82006 2012年02月29日
[Quote=引用 3 楼 pengzhixi 的回复:]

string是深拷贝构造函数那么就是深拷贝
[/Quote]

多谢,
能否给个key为 char*版本的multimap,同时自己定义一下采用 < 比较字符串的函数?
回复 点赞
pengzhixi 2012年02月29日
string是深拷贝构造函数那么就是深拷贝
回复 点赞
blueboy82006 2012年02月29日
[Quote=引用 1 楼 pengzhixi 的回复:]

3.是会拷贝一份的!
[/Quote]

是深拷贝还是浅拷贝?我想搞清楚是直接利用了原来的地址空间呢,还是开辟新空间,构造新的string,再把原string的内容复制过来。

这两种情况,显示效率有很大区别。
回复 点赞
pengzhixi 2012年02月29日
1.是的 是按照地址大小比较的。

2.当然能

3.是会拷贝一份的!
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告