2017-02-26 69 views
1

的矢量重複elemnts我讀Point結構的向量做進一步的處理非常大量的點的座標x,y和z,並將其儲存。除去非原始型

struct Point{ 
    double x,y,z; 
    Point (double x0, double y0, double z0): x(x0), y(y0), z(z0) {} 
} 


vector<Point> pv; 
pv.push_back (Point(x,y,z)); 

我也有,所有的點映射與同他們的矢量指數爲某些其他處理的unordered_multimap一起協調的哈希函數。

的問題是有,我從文件中讀取許多重複的觀點,我必須擺脫這些元素。我已經看到了有關如何從原始類型的向量中移除重複元素的解決方案,但這不適用於我的案例。此外,許多建議的方法需要對不適用於Point結構的排序。

+0

的std ::的remove_if? –

+0

在你的問題的情況下,這是沒有意義的說,有一點是比另一種更小或更大。但是,您仍然可以在點上引入總排序,這將使您能夠使用需要排序的方法(例如std :: unique)。例如,您可以先按x座標排序。如果兩個點具有相同的x座標,則按y座標排序。如果它們具有相等的y座標,則按z座標排序。如果z座標相等,則這些點是相等的。根據你如何得到價值觀,你使用雙打的事實可能會造成一個問題。 – IncongruentModulo1

回答

1

定義減少操作,然後應用相同的方法,基本類型

如何定義運算符是:

struct Point{ 
    (...) 
    const bool operator < (const Point &r) const{ 
     return (x<r.x) || (x==r.x && y<r.y) || (x==r.x && y==r.y && z<r.z); 
    } 
}; 
+0

或OP可以爲他的課程專門設置'std :: less'。 – HolyBlackCat

+1

或更慣用'返回的std ::領帶(X,Y,Z)<性病::領帶(r.x,r.y,r.z);'。 – Jarod42

1

可以使用所謂的erase-remove "idiom"

#include <algorithm> 
... 
pv.erase(std::remove(pv.begin(), pv.end(), pointToRemove), pv.end()); 

其中operator==已經爲Point定義:

bool operator==(Point a, Point b) { 
    return a.x == b.x && a.y == b.y && a.z == b.z; 
}