You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从std::multimap<int, std::pair<int, bool>>中删除重复元素?

针对std::multimap去重方案的分析

首先结论先行:你的这段代码核心逻辑是有效的,但存在一个潜在的初始化问题需要修正。

为什么原方案可行?

std::multimap的特性是按键自动排序,完全相同的元素(键+值对)会被连续存储在容器中。你的遍历逻辑通过记录上一个元素lastValue,逐个对比当前元素是否与前一个完全重复,重复则调用erase删除(这里erase返回下一个有效迭代器,完美避免了迭代器失效的问题,这部分写法是正确的);不重复则更新lastValue并移动迭代器。这个思路完全契合multimap的有序特性,能准确清理掉连续的重复项。

需要修正的潜在问题

原代码中lastValue的初始化值{-1 , {-1, -1}}存在风险:

  • 因为bool类型会将非零值隐式转换为true,所以lastValue.second.second实际是true。如果你的容器中恰好存在第一个元素为{-1, {-1, true}},那么第一次判断会误将该元素视为重复项并删除。

优化后的可靠版本

可以通过先判断容器是否为空,再用第一个元素初始化lastValue,从第二个元素开始遍历的方式规避这个问题:

if (!container.empty()) {
    auto lastValue = *container.cbegin();
    for (auto it = std::next(container.cbegin()); it != container.cend();) {
        if (it->first == lastValue.first && it->second == lastValue.second) {
            it = container.erase(it);
        } else {
            lastValue = *it;
            ++it;
        }
    }
}

额外说明

如果你的需求是仅按键去重(即每个键只保留一个元素,不管值对是否不同),那这个逻辑需要调整;但从你的代码来看,你是要删除完全重复的元素(键和值对都相同),那优化后的方案就完全满足需求。

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

火山引擎 最新活动