5

だから私は2つstd::mapのsを持っています<string, shared_ptr<file> >.1つは「古い」もので、もう1つは「新しい」ものです。そのようなことは可能で、どのように行うのですか?

4

1 に答える 1

9

これを自分で書くのは簡単ですが (反復しAてキーが に存在するかどうかを確認しますB)、これはstd::set_difference. ただし、キーを比較するには、ラムダまたはいくつかのカスタム述語が必要です。

#include <iterator>
#include <map>
#include <string>
#include <algorithm>

typedef std::map<std::string, MyPtr> my_map;

my_map A; // given
my_map B; // given

void make_a_difference()
{
  my_map C; // will hold the result

  std::set_difference(A.begin(), A.end(),
                      B.begin(), B.end(),
                      std::insert_iterator<my_map>(C, C.end()),
              [](const my_map::value_type & a, const my_map::value_type & b)
              { return a.first < b.first; }
                     );
}

これを自分で書きたい場合は、両方の範囲が既にソートされているという事実を利用することを検討する必要があります。そのため、2 つのイテレータを並行して進めることで、フラットな存在検索よりもうまく実行できます。

C++11 を使用していない場合は、ラムダの代わりに次の述語を使用してください。

bool my_comp(const my_map::value_type & a, const my_map::value_type & b)
{
  return a.first < b.first;
}

マップされた型には比較がないことに注意してください! したがって、両方のマップに同じ文字列キーがある場合、マップされた 2 つの値が異なっていても、結果にはそのような項目はありません。これが望ましくない場合は、別の出力コンテナ (たとえば a std::multimap<my_map::key_type, my_map::mapped_type>) と別の述語が必要です。

于 2011-10-09T21:40:27.690 に答える