2012-10-12 33 views
0

我有兩個向量對象叫做A和B. MyType類不是有一個字段ID,我想獲取MyType *在A中但不在B中。C++兩個向量之間的區別<MyType*>基於字符串成員的A和B

由於我沒有ID需要根據字符串字段進行比較。

我對象的類看起來像這樣

class Object 
    { 
     public: 
       Object(); 
     string  Name; 
     bool  Mode; 
     string  something; 
     Int   range; 
    } 


    vector<Object*> a; //asssume filled with objects 
    vector<Object*> b; //asssume filled with objects 
    vector<Object*> ret; 

現在我想要得到的(a,b) DIFF - 所有這些都是在與非B的成員。

如何繼續此操作。我嘗試使用strcmp()進行比較,但它不起作用。

+0

很難說出你在問什麼。也許有些代碼會澄清事情。 –

+0

請添加一些代碼 – nrofis

+0

當然,strcmp不能與字符串數據類型一起工作,它與char *數據類型一起工作。而且,沒有任何代碼可以做出明確的答案。 – enhzflep

回答

1

b的所有條目添加到set中。然後嘗試將a的所有條目添加到該集合中 - 每個成功的條目都是a中的條目,但不在b中。

如果是要比較的Name條目,而不是指針,請使用set<string>並將Name條目添加到該集合。

+0

我想比較兩個不同向量上所有對象的字符串字段。創建一個集合只會告訴我哪些字符串是唯一的,但不會將對象返回給我。 –

+0

沒錯,但是當這種情況發生時,你會經歷這些對象。所以當集合告訴你一個字符串是唯一的時,返回剛剛添加到集合中的字符串。您將會瀏覽將這些名稱添加到集合中的對象。當你瀏覽'a'中的對象時(在通過'b'之後),每個添加的名字都會告訴你,你正在操作的'a'中的對象應該被返回。 –

+0

比必要更復雜。 –

-1

這似乎是set_differencehttp://www.cplusplus.com/reference/algorithm/set_difference/)的完美工作。

爲對象提供一個比較器,對兩個向量進行排序(使用該比較器),然後使用set_difference(使用相同的比較器)獲取第一個但不是第二個的對象。

1

這將使用現有的STL算法:

bool compPtrByName(Object *const &p1, Object *const &p2) { 
    return p1->Name < p2->Name; 
} 

,然後調用

std::sort(a.begin(), a.end(), compPtrByName); 
std::sort(b.begin(), b.end(), compPtrByName); 
std::set_difference(a.begin(), a.end(), b.begin(), b.end(), ret.begin(), compPtrByName); 

如果重新排序的載體是不允許的,那麼首先複製它們。

注意:這給出了集合差異A - B.對於對稱差異(A - B)聯合(B - A),請使用std::set_symmetric_difference

相關問題