Yani 2 std::map
s <string, shared_ptr<file> >
var bir 'eski' biri 'yeni' Hangi dosyaları almak istiyorum kaldırıldı ve böylece farklı difte yineleme ve shared_ptr bazı şeyler yapmak için yeteneğine sahip. Böyle bir şey mümkün ve nasıl yapılır?Başka bir harita tuşlarının bir listesini çıkarma ve yeni harita alma (harita A - mab B = harita C)
Başka bir harita tuşlarının bir listesini çıkarma ve yeni harita alma (harita A - mab B = harita C)
cevap
Bunu kendiniz yazacak kadar kolay olsa da (A
üzerinden yineleyin ve anahtarın B
'da mevcut olup olmadığını kontrol edin), bu std::set_difference
için bir işe benziyor. Bu kendini yazmak istiyorsanız her iki aralıkları zaten sıralanır gerçeği yararlanarak düşünmelisiniz,
#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; }
);
}
, bu nedenle yapabilirsiniz: Biz olsa lambda veya anahtarları karşılaştırmak için bazı özel yüklemi, gerekir paralel olarak iki yineleyici ilerleyerek varoluş için düz bir arama daha iyi.
C++ 11 yoksa, sadece yerine lambda bu yüklemi:
bool my_comp(const my_map::value_type & a, const my_map::value_type & b)
{
return a.first < b.first;
}
eşlenmiş türüne hiçbir karşılaştırma olduğunu dikkat! Dolayısıyla, her iki haritada da aynı dize anahtarı varsa, iki eşlenen değer farklı olsa bile sonuçta böyle bir öğe olmayacaktır. Bu istenmeyen bir durumsa, farklı bir çıktı kabına (örneğin, std::multimap<my_map::key_type, my_map::mapped_type>
) ve farklı bir yüklemeye ihtiyacınız vardır.
'' 'std :: set_difference''' bir göz atın. –