检查std :: map的所有值是否相等的最简单方法

时间:2012-10-10 12:31:46

标签: stl stdmap

检查所有键的某些std :: map的值是否相等,没有(至少可见)迭代所有键的最简单方法是什么?可以在一次操作中完成吗?

4 个答案:

答案 0 :(得分:3)

使用std::unique,然后验证地图的开始迭代器与std::unique返回的结束迭代器之间的距离是否为1.

答案 1 :(得分:2)

获取第一个元素的值,然后使用带有自定义谓词的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; });
}

答案 2 :(得分:0)

此功能可能符合您的需求

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();
  }

答案 3 :(得分:0)

如果你可以使用一个冗余的比较,你甚至可以在没有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);
}

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