map中使用char * 或string作为key值的一个大坑

现象:使用map的insert插入多条数据,map的size永为1,只存一条最后数据的问题

案例如下:

string container_name
char container_size[16];
for 循环
{
//每次循环的container_name值都是不同的
ContainerSizeMap.insert(pair<string,string>(container_name,(string)container_size));
}

但是手动添加,可以添加进去,而且size大小会递增

ContainerSizeMap.insert(pair<string,string>({"111",(string)container_size}));
ContainerSizeMap.insert(pair<string,string>({"222",(string)container_size}));

map只有在key相同时才会不插入,所以初步怀疑是container_name作为key值相同了,但是明明每次的container_name
都不同,但是指针的地址是相同的,所以认为是把地址作为key了,使用%p打印出地址,确实是相同的

address:0x7f8cb1d0fe10,test190 container_size=56K    0x7f8cb1d0fe20
address:0x7f8cb1d0fe10,test104 container_size=3.0G   0x7f8cb1d0fe20

所以不能使用指针作为key值,因为map中的比较函数如下,在比较的时候,比较的也只是地址而已

template <class _Tp>
    struct equal_to : public binary_function<_Tp, _Tp, bool>
    {
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x == __y; }
    };

所以如果必须使用指针作为key,必须重载比较函数。

或者把申请内存空间放在for循环里每次申请新的地址,保证每次地址都不相同。 优化代码如下

for 循环
{
	char *container_name=new char[16];
	char *container_size=new char[16];
	//每次循环的container_name值都是不同的
	ContainerSizeMap.insert(pair<string,string>((string)container_name,(string)container_size));
      if(container_name!=NULL)
     {
         delete []container_name;
         container_name = NULL;
     }
     if(container_size!=NULL)
     {
         delete []container_size;
         container_size = NULL;
     }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用 `char*` 作为 `map` 的键时,需要注意以下几点: 1. `char*` 是一个指针类型,需要使用指针比较函数来进行比较,否则默认比较的是指针地址而不是字符串内容。 2. `char*` 类型的键需要手动管理内存,因为 `map` 不会为其分配内存,也不会在键被删除时自动释放内存,需要程序员自行管理。 以下是一个示例代码,用于演示如何使用 `char*` 作为 `map` 的键: ```c++ #include <iostream> #include <map> #include <string.h> struct cmp { bool operator()(const char* a, const char* b) const { return strcmp(a, b) < 0; } }; int main() { std::map<char*, int, cmp> mp; char str1[] = "hello"; char str2[] = "world"; mp[str1] = 1; mp[str2] = 2; auto it = mp.find(str1); if (it != mp.end()) { std::cout << it->second << std::endl; // 输出 1 } return 0; } ``` 在上面的代码,我们定义了一个结构体 `cmp`,其重载了 `()` 运算符,用于比较两个 `char*` 类型的键。我们在定义 `map` 时指定了这个比较函数,这样 `map` 就会使用我们自定义的比较函数来比较键的大小了。 在插入键对时,我们使用了两个 `char` 数组 `str1` 和 `str2` 作为键,并分别对其赋为 `"hello"` 和 `"world"`。由于 `char` 数组可以隐式转换为 `char*` 类型,因此我们可以直接将 `char` 数组作为 `map` 的键。 需要注意的是,在删除键时需要手动释放相应的内存。在上面的代码,由于 `char` 数组的内存是在栈上分配的,因此不需要手动释放。如果使用 `malloc` 或 `new` 等动态分配内存的方式来创建 `char*`,则需要在删除键时手动释放相应的内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值