【问题标题】:The easiest way to check if all values of std::map are equal检查 std::map 的所有值是否相等的最简单方法
【发布时间】:2012-10-10 12:31:46
【问题描述】:

检查某些 std::map 的值对于所有键是否相等,而不(至少,可见)遍历所有键的最简单方法是什么?可以一次性完成吗?

【问题讨论】:

    标签: stl stdmap


    【解决方案1】:

    获取第一个元素的值,然后使用带有自定义谓词的std::all_of 检查其余元素。比如:

    if (!mp.empty()) {
        int val = mp.begin()->second;
        result = std::all_of(std::next(mp.begin()), mp.end(), 
                             [val](typename <insert map type>::const_reference t){ return t->second == val; });
    }
    

    【讨论】:

    • std::all_of 顺便说一句是 C++11
    【解决方案2】:

    使用std::unique,然后验证map的开始迭代器和std::unique返回的结束迭代器之间的距离为1。

    【讨论】:

    • 这不是一个有效的解决方案,因为std::unique 修改了地图。
    • @Andrey:是的,但是 OP 要求使用“最简单”的方式(在“一次操作”中可行);我认为std::unique 解决方案会很短,但实际上可能并非如此(我开始怀疑std::unique 是否可以与std::map 迭代器一起使用,因为迭代器指向具有const 第一个字段的一对) .
    【解决方案3】:

    此功能可能适合您的需求

    template <typename Map>
    bool IsUnique(const Map& i_map)
      {
      return std::count_if(i_map.cbegin(), i_map.cend(), 
          [&i_map] (typename Map::const_reference v)
          { 
          return v.second == i_map.cbegin()->second; 
          }) == i_map.size();
      }
    

    【讨论】:

    • 这不是一个有效的解决方案,因为count_if 不会提前终止(一旦发现第一个不匹配,函数就会返回)。 ;-)
    【解决方案4】:

    如果您可以接受一个冗余比较,您甚至可以不使用 if 语句使用 std::all_of 检查空映射:

    template<typename Key, typename Value>
    bool all_equal(std::map<Key, Value> const& map)
    {
        // the lambda will only get called when the map is not empty
        // so we can safely access begin()->second
        auto const cmpWithFirst = [&](std::pair<Key,Value> const& i)
        {
            return map.begin()->second == i->second;
        };
    
        return std::all_of(map.begin(), map.end(), cmpWithFirst);
    }
    

    这会将所有元素与第一个元素(如果有)进行比较,包括将第一个元素与第一个元素进行比较。

    【讨论】:

      猜你喜欢
      • 2023-01-12
      • 2012-12-16
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多