2014-04-21 34 views
1

我有一個C++結構向量。該結構包含一個int和兩個字符串變量。我想擦除矢量中的重複值。我試過使用STD :: UNIQUE,但我知道這不是正確的方法。請幫助我解決我的問題的有效方法。提前致謝。在C++中刪除結構向量中的重複值

+0

顯示你有什麼嘗試和你失敗的地方。 –

+0

此外,沒有必要尋求一個「有效的」解決方案,因爲無效的解決方案根本就不是解決方案。 –

回答

3

可以在兩個步驟中執行此操作:

1)分類使用std::sort與合適的二進制謂詞的載體。謂詞通過實施strict weak ordering來設置分類標準。

2)使用類似erase-remove的成語與std::uniquestd::unique必須與步驟應用於排序相同的順序調用1

例子:

struct Foo 
{ 
    int a; 
    std::string b, c; 
}; 

// lexicographical comparison provides strict weak ordering 
bool cmp(const Foo& lhs, const Foo& rhs) 
{ 
    return std::tie(lhs.a, lhs,b, lhs.c) < std::tie(rhs.a, rhs.b, rhs.c); 
} 

std::vector<Foo> v = .... 
std::sort(vec.begin(), vec.end(), cmp); 
vec.erase(std::unique(vec.begin(), vec.end(), cmp), vec.end()); 
+0

我懷疑OP想擦除所有*非唯一元素,而不是保留一個單獨的元素。至少這是我從「我知道'獨特'不是正確的方法。」 (然後再次,OP說「我知道」應該可以採取一粒鹽。) –

+0

@KerrekSB好點。有一天,我會嘗試在打字前閱讀這些問題。不是說這個問題提供了很多有用的信息。 – juanchopanza

+0

這個問題是完全無法回答的:-) –

2

如果你真的不介意的初始訂單,那麼你可以排序的載體,然後用獨特的方法 你有一個結構向量,所以你需要定義一個運算符<。我會發布一些代碼有點

假設你有下面的結構

struct myStruct 
{ 
    int a; 
    string b; 
    string c; 
} 

您需要定義一個操作者的元素進行排序

inline bool operator <(const myStruct& lhs, const myStruct& rhs) 
{ 
    return ( (lhs.a<rhs.a) 
     || ((lhs.a==rhs.a) && (lhs.b< rhs.b)) 
     || ((lhs.a==rhs.a) && (lhs.b== rhs.b) (lhs.cb< rhs.c))); 
} 

然後,你需要理清你的載體並使用獨特的 http://www.cplusplus.com/reference/algorithm/unique/

vector<myStruct> vMyStruct; 
vMyStruct.push_back(myStruct(1,"abc","abc")); 
vMyStruct.push_back(myStruct(2,"abc","abc")); 
vMyStruct.push_back(myStruct(1,"abc","abc")); 
vMyStruct.push_back(myStruct(2,"def","def")); 
vMyStruct.push_back(myStruct(2,"def","ghi")); 
vMyStruct.push_back(myStruct(3,"def","ghi")); 

std::sort (vMyStruct.begin(), vMyStruct.end()); // using default comparison: 
std::vector<myStruct>::iterator it = std::unique (vMyStruct.begin(), vMyStruct.end());