如何在C++中实现类似Python的dict["hello"]=20字典赋值语法?
解决C++字典类的
operator[]赋值问题 嘿,很高兴看到你自己动手实现字典类!关于你问的dict["hello"]=20这种赋值操作,核心问题在于你当前的operator[]返回的是int值类型——它只是个临时拷贝,没法作为左值被修改。咱们一步步来解决这个问题,顺便还能修复代码里的一些潜在bug:
1. 修改operator[]返回类型为引用
要让[]支持赋值,你需要让它返回可修改的引用(int&),这样就能直接对字典里的对应值进行修改了。同时,还要处理「key不存在时赋值」的场景——通常这种情况应该自动添加新的键值对。
先更新类声明里的operator[]:
class Dict { public: Dict(string key, int value); ~Dict(); void append(string key, int value); int& operator[](string search); // 改为返回int& private: string* keys; int have_keys; int* values; };
2. 实现支持赋值的operator[]
遍历查找key,如果找到就返回对应value的引用;如果没找到,就先调用append添加新键值对(默认值设为0),再返回新添加的value的引用:
int& Dict::operator[](string search) { for(int i = 0; i < have_keys; i++){ if(keys[i] == search){ return values[i]; // 返回引用,允许外部修改 } } // 没找到key,自动添加新条目 append(search, 0); return values[have_keys - 1]; // 返回刚添加的value的引用 }
3. 修复append方法的内存问题
你当前用memcpy拷贝string数组是错误的!string是C++类对象,内部包含动态分配的内存,memcpy只是做浅拷贝(复制字节),会导致多个string对象共享同一块内存,析构时重复释放引发崩溃。应该用循环逐个拷贝string:
void Dict::append(string key, int value) { string* temp_keys = new string[have_keys + 1]; // 逐个拷贝string,调用string的拷贝构造函数 for(int i = 0; i < have_keys; i++){ temp_keys[i] = keys[i]; } temp_keys[have_keys] = key; int* temp_values = new int[have_keys + 1]; memcpy(temp_values, values, sizeof(int)*have_keys); // int是基本类型,memcpy没问题 temp_values[have_keys] = value; // 释放旧数组,避免内存泄漏 delete[] keys; delete[] values; // 更新指针和计数 keys = temp_keys; values = temp_values; have_keys++; }
4. 补充析构函数实现
你声明了析构函数但没实现,必须添加它来释放动态分配的数组,否则会造成内存泄漏:
Dict::~Dict() { delete[] keys; delete[] values; }
现在测试一下
修改完成后,你就可以像这样使用了:
Dict dict = Dict("hello", 10); int a = dict["hello"]; // 取值,a=10 dict["hello"] = 20; // 赋值,现在hello对应的值是20 dict["new_key"] = 30; // 自动添加新键值对
这样就完全满足你的需求啦!
内容的提问来源于stack exchange,提问作者Ben_TW
相关产品推荐
相关产品推荐

