2010-09-04 85 views
1

獨特的問題下面的代碼:的std ::排序和std ::與結構

#include <vector> 
#include <algorithm> 

struct myStructDim 
{ 
    int  nId; 
    int  dwHeight; 
    int  dwWidth; 
};  

void main() 
{ 
    ::std::vector<myStructDim> m_vec_dim; 

    ::std::sort(m_vec_dim.begin(), m_vec_dim.end()); 
    m_vec_dim.erase(
     ::std::unique(m_vec_dim.begin(), m_vec_dim.end()), 
     m_vec_dim.end() 
     ); 
} 

不會與許多錯誤,比如編譯:

錯誤C2784:「布爾STD: :操作者 ==(常量的std ::矢量< _Ty,_Alloc> &,常量性病::矢量< _Ty,_Alloc> &) ': 無法推斷出模板參數爲 ' 常量性病::矢量< _Ty,_Allo C> &「從 ‘myStructDim’

我明白,我要重寫操作或兩個。

哪些和請問如何?

感謝您的支持!

回答

4

您需要比較運算符來表達「小於」和「平等」關係。定義獨立布爾函數operator<operator==需要兩個參數,每個參數爲const myStructDim&,並根據需要執行比較,可能比定義struct中的方法要簡單。

+0

是啊。對此不確定。非常感謝! – Poni 2010-09-04 02:50:56

+0

@Poni,不客氣! – 2010-09-04 04:06:32

1

您需要某種形式的比較函數sort,並且您需要某種形式的相等函數unique

0

像其他人提到的操作符<和運算符==會做的伎倆,但我通常喜歡傳遞比較謂詞。

在本例中我使用C++ 0x lambdas,但它可以在沒有這個的情況下實現。

std::sort(
     vec_dim.begin(), 
     vec_dim.end(), 
     [] (myStructDim const & l, myStructDim const & r) {return l.nId < r.nId;} 
    ); 

    vec_dim.erase( 
     std::unique(
     vec_dim.begin(), 
     vec_dim.end(), 
     [] (myStructDim const & l, myStructDim const & r) {return l.nId == r.nId;} 
     ), 
     vec_dim.end() 
    ); 
0

是沒可能有某種獨特而無需operato>?我的意思是我可以理解,爲了獨特我需要一個操作員==(像蘋果不是椅子),但爲什麼椅子應該比蘋果更大?我將不得不爲某些對象實現一個操作符,因爲這是毫無意義的!也許某種隱瞞會更有意義。 所以我決定實現是什麼的問題是我自己在這裏我認爲一個解決方案,更有意義:

模板內嵌 無效的唯一身份(listtype在,listtype &出) { Out.resize(在。尺寸()​​); std :: copy(In.begin(),In.end(),Out.begin()); listtype :: iterator it = Out.begin(); listtype :: iterator it2 = Out.begin(); it2 ++; int tmpsize = Out.size();

while(it!=Out.end()) 
    { 
    it2 = it; 
    it2++; 
    while((it2)!=Out.end()) 
     { 
     if ((*it)==(*it2)) 
      Out.erase(it2++); 
     else 
      ++it2; 
     } 
    it++; 

    } 
} 

也許不是最好的解決辦法,但此刻我不知道更佳