2

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

4

4 回答 4

4

获取第一个元素的值,然后使用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; });
}
于 2012-10-10T15:56:24.503 回答
2

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

于 2012-10-10T12:33:30.243 回答
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();
  }
于 2012-10-10T13:23:15.393 回答
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);
}

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

于 2013-03-26T13:10:15.623 回答