gpt4 book ai didi

带有自定义比较器存储空指针的 C++ STL 映射

转载 作者:太空狗 更新时间:2023-10-29 21:07:02 25 4
gpt4 key购买 nike

我正在尝试为管理包含指针的 STL 映射的对象编写复制构造函数,其中键是字符串。但是,当我尝试在映射中插入新值时,指针设置为 NULL:

// ...
for(std::map<std::string, data_base*, order>::const_iterator it = other.elements.begin();
it != other.elements.end(); ++it){
data_base *t = it->second->clone();
std::cout << "CLONE: " << std::hex << t << std::endl;
elements[it->first] = t;
std::cout << "INSERTED: " << std::hex << elements[it->first] << std::endl;
}
// ...

other 是被复制的对象,elements 是 map 。 clone() 方法返回一个指向新对象的指针(通过 new)。

运行上面的代码我得到类似的东西:

CLONE: 0xcfbbc0
INSERTED: 0

我不是一个非常有经验的程序员,这个问题可能很容易解决,但我没有找到任何解决方案。

非常感谢您的宝贵时间。

最佳答案

除了可能之外,我没有发现这段代码有任何问题

std::map<std::string, data_base*, order>::const_iterator it

此处 order 给出了用于对映射中包含的对进行排序的关键比较器(通常实现为树)。

也许你在其中做错了什么,让你的 [] 运算符找不到正确的 ke,让你的最后一行记录了一个新的 ptr 对。

首先,尝试不使用该 order,使用默认的键比较器 (std::less),然后如果它不起作用,发布您的 order 定义和 map 声明。如果这还不够,只需提供一个简单的完整程序来重现问题。


我刚刚写了一个简单的类似测试,使用默认的键比较器:

#include <map>
#include <string>
#include <iostream>

struct Data
{
int k;

Data* clone() { return new Data(); }
};

typedef std::map< std::string, Data* > DataMap;

DataMap data_map;


int main()
{
data_map[ "hello" ] = new Data();
data_map[ "world" ] = new Data();

DataMap other_map;

for( DataMap::const_iterator it = data_map.begin(); it != data_map.end(); ++it)
{
Data*t = it->second->clone();
std::cout << "CLONE: " << std::hex << t << std::endl;
other_map[it->first] = t;
std::cout << "INSERTED: " << std::hex << other_map[it->first] << std::endl;
}

std::cin.ignore();

return 0;
}

在 VS2010SP1 上,输出:

CLONE: 00034DD0
INSERTED: 00034DD0
CLONE: 00035098
INSERTED: 00035098

所以应该是问题所在,或者是你之前做错了什么。

关于带有自定义比较器存储空指针的 C++ STL 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5998496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com