C++中按引用传递Node对象std::vector的addUnique计数异常问题
计数结果不符的核心问题
- 根本错误出在
addUnique函数的遍历逻辑
原代码中for (Node used: list)是值遍历写法,循环里的used是vector中每个Node对象的临时拷贝,并非vector内元素的引用。当匹配到和输入字符一致的baseChar时,执行的used.count++只会修改这个临时拷贝的计数值,原vector里对应的Node对象完全没有被改动,计数累加的操作完全失效,最终表现为不管同一个字符在输入字符串里出现多少次,对应节点的count永远保持初始值1,和预期的累加计数结果完全不符。
修正方法是将循环变量改为引用类型,让used直接绑定vector内的原对象,修改才能真正生效:for (Node& used: list) { if (used.baseChar == check) { used.count++; return; } } - 同类写法隐患
主函数中最终输出节点的循环for (Node node: nodes)同样是值拷贝遍历。目前因为循环内仅调用display()读取属性,不会影响输出结果,但如果后续要在该循环中修改节点属性,同样会出现修改临时拷贝不生效的问题,建议统一替换为引用遍历写法。 - 额外代码风险提示
当前Node类的构造函数没有对composition1、composition2两个指针成员做初始化,后续如果使用这两个指针会触发野指针访问问题,该问题和当前计数逻辑无关,但属于代码隐患。
内容的提问来源于stack exchange,提问作者Mathematical Lie
相关产品推荐
相关产品推荐

