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

C++数组索引值自增操作的Objective-C等价实现疑问

嘿,我来帮你把这个问题掰扯清楚~

先搞懂cnt[d[i]]++到底啥意思

这个C++表达式其实就是个数值计数操作,拆解开看就明白:

  • d[i]:取数组d里第i个位置的数值,比如你给的例子d[0]=4,那这里就是4;
  • cnt[d[i]]:访问计数数组cnt中索引等于d[i]的元素,也就是cnt[4];
  • ++:后置自增,意思是先拿当前cnt[d[i]]的值来用(如果有需要的话),再把这个元素的数值加1。比如你说cnt[4]=2,执行完cnt[d[0]]++后,cnt[4]就变成3了。

整体作用就是统计d数组里每个数值出现的次数——每碰到一个数值x=d[i],就把计数数组里对应x位置的数字加1。

你的Objective-C代码为啥有问题?

看你写的OC代码,有个致命问题:你初始化了NSMutableArray *d = [NSMutableArray new];,但这个数组是空的啊!然后直接在循环里[d objectAtIndex:i],这肯定会触发数组越界崩溃,因为d里啥元素都没有。

另外还有个小坑:如果cnt是局部变量的话,C风格数组默认是随机值,不是0,这会导致你的计数完全不准,必须手动初始化。

正确的Objective-C实现方式

方式1:沿用C风格数组(和C++逻辑完全一致)

这种方式最贴近你原来的C++代码,OC完全兼容C语法,所以直接用就行,注意先给d数组填元素,初始化cnt:

// 初始化计数数组,全部置为0(局部变量必须做这个,全局数组会默认初始化为0)
int cnt[100001] = {0}; 
int ans = 0;
int N = 4;

// 先给d数组填充示例元素,比如模拟你说的d[0]=4的场景
NSMutableArray *d = [NSMutableArray arrayWithObjects:@4, @4, @2, @4, nil];

for(int i = 0; i < N; i++){
    int dOfI = [[d objectAtIndex:i] intValue];
    // 这里和C++的cnt[d[i]]++完全等价,直接用就行
    cnt[dOfI]++;
    if(ans < cnt[dOfI]){
        ans = cnt[dOfI];
    }
}

NSLog(@"出现次数最多的数值次数是:%d", ans); // 这里会输出3,因为4出现了3次

方式2:用Objective-C的NSMutableDictionary(更灵活)

如果你的数值范围不确定,不想用固定大小的C数组,用字典来计数更合适:

int ans = 0;
int N = 4;
NSMutableArray *d = [NSMutableArray arrayWithObjects:@4, @4, @2, @4, nil];
NSMutableDictionary *countDict = [NSMutableDictionary dictionary];

for(int i = 0; i < N; i++){
    NSNumber *num = d[i];
    // 获取当前计数,没有的话默认是0
    NSInteger currentCount = [countDict[num] integerValue];
    currentCount++;
    countDict[num] = @(currentCount);
    
    if(currentCount > ans){
        ans = currentCount;
    }
}

NSLog(@"出现次数最多的数值次数是:%d", ans); // 同样输出3
最后总结下
  • cnt[d[i]]++的核心就是给d数组里的每个数值做计数累加,用C风格数组的话OC里直接照搬语法就行;
  • 你原来的OC代码崩溃是因为d数组为空就取值,一定要先给d加元素;
  • 局部C数组记得初始化,不然会有随机值干扰计数;
  • 用OC字典的话更灵活,适合数值范围不固定的场景。

内容的提问来源于stack exchange,提问作者user6298177

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:46:21