2016-10-04 65 views
2

我有2個向量,指向Point的指針的類型以利用多態性思想,因爲我有一些類型的繼承自Point類的點類。STL向量指針上的等於運算符

vector<Point*> previous_points; 
vector<Point*> current_points; 

init_points(previous_points); 
init_points(current_points); 

do_some_proccess(previous_points); 
do_some_proccess(current_points); 

cout << (previous_points == current_points) << endl; // returns 0 

==操作符返回我0,即使內容是相同的,其原因是(從我讀並理解),這是比較向量內容是指針和指針是不(init_points爲每個矢量創建具有相同內容的新對象)。

我的問題是,我仍然可以使用比較運算符,並得到它比較我的向量中的指針的內容,而不是指針本身?或者我必須執行我自己的is_content_equals函數來做到這一點?

編輯:我已經在Point類中實現了equals ==運算符,因此它正在比較點的內容。

謝謝

+4

如果指針不一樣,那麼內容就不一樣了。 – juanchopanza

+2

您的比較只會比較向量中的*指針*,而不是它們指向的對象。 –

+0

我已經在Point類中實現了equals ==運算符,因此它正在比較內容。忘了提及它。 –

回答

9

您不必推出自己的功能。您可以使用std::equal,並使用合適的謂詞。這假定工作operator==Point

bool ok = equal(begin(previous_points), end(previous_points), 
       begin(current_points), end(current_points), 
       [](const Point* lhs, const Point* rhs){ return *lhs == * rhs; }); 

Pre C++ 14,你可以使用這個重載。在這裏,確保current_points的長度與previous_points的長度相同取決於您。

bool ok = equal(begin(previous_points), end(previous_points), 
       begin(current_points), 
       [](const Point* lhs, const Point* rhs){ return *lhs == * rhs; }); 
+0

哦,太棒了,預C++ 14超載爲我工作。最後一個問題,這是由我來確保長度是相同的,因爲你的意思是我需要做這2個檢查(長度和內容),以便像==那樣有效地進行等效比較呢?再次感謝,我想我需要學習更多關於lambda函數的C++,這是我第一次用這種語言來使用它。 –

+0

@DimaGimburg是的,這就是我的意思。 'std :: equal'比較範圍,並且pre-C++ 11只設置第二個的開始。所以'=='有兩個不同的地方。首先,第二個範圍更長。那麼'=='應該是錯誤的,但子範圍可以等於第一個子範圍。其次,第二個範圍可能更短,在這種情況下,你超越邊界並得到*未定義的行爲*,這是非常糟糕的並且必須避免。 – juanchopanza

+2

這是_is_滾動你自己的功能^ _ ^ –