You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:15:21