2010-04-13 53 views
2

之前沒有使用set_intersection,但我相信它可以與地圖一起使用。我寫了下面的示例代碼,但它並沒有給我什麼,我期望:使用帶有set_intersection的地圖

#include <map> 
#include <string> 
#include <iostream> 
#include <algorithm> 

using namespace std; 

struct Money 
{ 
    double amount; 
    string currency; 

    bool operator< (const Money& rhs) const 
    { 
     if (amount != rhs.amount) 
      return (amount < rhs.amount); 
     return (currency < rhs.currency); 
    } 
}; 

int main(int argc, char* argv[]) 
{ 
    Money mn[] = 
    { 
     { 2.32, "USD" }, 
     { 2.76, "USD" }, 
     { 4.30, "GBP" }, 
     { 1.21, "GBP" }, 

     { 1.37, "GBP" }, 
     { 6.74, "GBP" }, 
     { 2.55, "EUR" } 
    }; 

    typedef pair< int, Money > MoneyPair; 
    typedef map< int, Money > MoneyMap; 

    MoneyMap map1; 
    map1.insert(MoneyPair(1, mn[0])); 
    map1.insert(MoneyPair(2, mn[1])); 
    map1.insert(MoneyPair(3, mn[2])); // (3) 
    map1.insert(MoneyPair(4, mn[3])); // (4) 

    MoneyMap map2; 
    map2.insert(MoneyPair(3, mn[2])); // (3) 
    map2.insert(MoneyPair(4, mn[3])); // (4) 
    map2.insert(MoneyPair(5, mn[4])); 
    map2.insert(MoneyPair(6, mn[5])); 
    map2.insert(MoneyPair(7, mn[6])); 

    MoneyMap out; 
    MoneyMap::iterator out_itr(out.begin()); 
    set_intersection(map1.begin(), map1.end(), map2.begin(), map2.end(), inserter(out, out_itr)); 

    cout << "intersection has " << out.size() << " elements." << endl; 
    return 0; 
} 

由於標記(3)和(4)同時出現在地圖中的一對,我期待,我會得到2種元素在路口,但沒有,我得到:

intersection has 0 elements. 

我敢肯定,這是值得做的地圖/對的比較器,但不能弄明白。

回答

5
MoneyMap map2; 
map1.insert(MoneyPair(3, mn[3])); // (3) 
map1.insert(MoneyPair(4, mn[4])); // (4) 
map1.insert(MoneyPair(5, mn[5])); 
map1.insert(MoneyPair(6, mn[6])); 
map1.insert(MoneyPair(7, mn[7])); 

除非這是一個錯字,你只是重新插入到的東西,而不是MAP1的插入MAP2。我用正確的代碼對它進行了測試,並輸出「交叉點有2個元素」。

+0

謝謝,你是對的,我糾正了代碼。我從客戶端的原始代碼中重新輸入了這個信息。客戶對發佈代碼有嚴格的規定,所以我不得不重新輸入並且沒有發現錯誤。 – 2010-04-15 05:50:55

6

Niki對你的錯字肯定是正確的 - map2在這裏是空的!但是,你需要小心別的事情。

比方說,你的代碼是這樣的:

MoneyMap map1; 
map1.insert(MoneyPair(1, mn[1])); 
map1.insert(MoneyPair(2, mn[2])); 
map1.insert(MoneyPair(3, mn[3])); // (3) 
map1.insert(MoneyPair(4, mn[4])); // (4) 

MoneyMap map2; 
map2.insert(MoneyPair(3, mn[4])); // (3) 
map2.insert(MoneyPair(4, mn[3])); // (4) 
map2.insert(MoneyPair(5, mn[6])); 
map2.insert(MoneyPair(6, mn[5])); 
map2.insert(MoneyPair(7, mn[1])); 

MoneyMap out; 
MoneyMap::iterator out_itr(out.begin()); 
set_intersection(map1.begin(), map1.end(), 
       map2.begin(), map2.end(), 
       inserter(out, out_itr)); 

現在,會發生什麼?您會發現out將爲空,因爲set_intersection使用std::less來比較元素,並且您的地圖的元素是成對的 - 因此(3,mn [3])與(3,mn [4])不同。

你能做到這一點的另一種方式是通過寫現在

set_intersection(map1.begin(), map1.end(), 
       map2.begin(), map2.end(), 
       inserter(out, out_itr), map1.value_comp()); 

out將包含兩個要素:(3,MN [3])和(4萬[4]),因爲他們的匹配。元素始終從第一個迭代器範圍複製。

請注意,地圖總是按它們包含的類型map::value_compare排序。如果使用時髦的比較函數,set_intersection將不會在沒有顯式提供比較函數的情況下工作,如果地圖的元素沒有按照std::less的順序發生。

+0

非常感謝。我遇到的問題是運算符<()中的一個錯誤, – 2010-04-15 05:52:30