5
所以我有2 std::map
s <string, shared_ptr<file> >
一個是'舊'一個是'新'我想要得到什麼文件被刪除,所以能夠迭代thrue不同,並做一些東西到shared_ptr。這樣的事情是可能的嗎?怎麼做?如何從另一個減去一個地圖鍵列表並獲取新地圖(地圖A - mab B =地圖C)
所以我有2 std::map
s <string, shared_ptr<file> >
一個是'舊'一個是'新'我想要得到什麼文件被刪除,所以能夠迭代thrue不同,並做一些東西到shared_ptr。這樣的事情是可能的嗎?怎麼做?如何從另一個減去一個地圖鍵列表並獲取新地圖(地圖A - mab B =地圖C)
儘管您自己編寫代碼很容易(重複執行A
並檢查密鑰是否存在於B
中),但這看起來像std::set_difference
的作業。我們需要一個lambda或一些自定義的謂詞鍵進行比較,雖然:
#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; }
);
}
如果你想這個寫自己,你應該考慮的事實,這兩個區域都已經按順序排列的,所以你可以做通過並行推進兩個迭代器,比單純搜索存在更好。
如果你沒有C++ 11,只是使用的,而不是拉姆達這個謂詞:
bool my_comp(const my_map::value_type & a, const my_map::value_type & b)
{
return a.first < b.first;
}
當心有上映射的類型沒有可比性!因此,如果在兩個映射中都有相同的字符串鍵值,那麼結果中就不會有這樣的項目,即使兩個映射值不同。如果這是不可取的,你需要一個不同的輸出容器(例如一個std::multimap<my_map::key_type, my_map::mapped_type>
)和一個不同的謂詞。
看看'''std :: set_difference'''。 –