2

一部の std::map の値がすべてのキーに対して等しいかどうかを確認する最も簡単な方法は何ですか? 1回の施術でできますか?

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して、マップの開始イテレータと返される終了イテレータの間の距離がstd::unique1 であることを確認します。

于 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

冗長な比較を 1 つ行うことができる場合は、std::all_of を使用して空のマップをチェックする if ステートメントを使用しなくても実行できます。

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 に答える