2012-06-17 71 views
1

我有一個類CL1:C++排序類類矢量內

class c1 
{ 
long double * coords; 
... 
} 

我也有一個第二類CL2:

class cl2 
{ 
vector<cl1*> cl1_vec; 
unsigned int d; 
... 
} 

我想排序cl1_vec,從CL2,基於coords [d],使用向量的排序函數。 所以我可以有類似

sort(cl2_inst->cl1_vec.begin(),cl2_inst->cl1_vec.end(), ???); 

我試着像approches

sort the 'std::vector' containing classes

C++ std::sort with predicate function in Class

,但我不能讓我的方式來解決這一點。

感謝您的任何幫助,這種方式。

代碼中,我已經試過:

class cl1 { 
    public: 
     long double* coords; 

     cl1(long double *, unsigned int); 
     cl1(); 
     cl1(const cl1& orig); 
     virtual ~cl1();   
}; 

class cl2 { 

    public: 

    unsigned int d; 

    vector<cl1*> cl1_vec; 

    //the srting functions 
    static bool compareMyDataPredicate(cl1* lhs, cl1* rhs) 
    { 
     return (lhs->coords[d] < rhs->coords[d]); 
    }; 
    // declare the functor nested within MyData. 
    struct compareMyDataFunctor : public binary_function<my_point*, my_point*, bool> 
    { 
     bool operator()(cl1* lhs, cl1* rhs) 
     { 
      return (lhs->coords[d] < rhs->coords[d]); 
     } 
    }; 
    ... 
    ... 
} 

然後在主

std::sort(cl2_inst->cl1_vec.begin(),cl2_inst->cl1_vec.end(),cl2::compareMyDataPredicate()); 
+1

請發表您試圖代碼,並介紹沒有關於它的工作。 –

+0

我將編輯問題並將代碼試過我試過 – 0gap

+0

你想排序什麼?長雙*座標?什麼類型是cl1?錯字? – Martin

回答

0

我不知道有關的問題,因爲你沒有什麼確切「不工作」不夠精確意味着你的情況(不編譯,編譯但不排序等)。如果它沒有編譯(很可能是猜測),你沒有發佈錯誤消息,這也使得很難找到並解釋問題。

以下是根據您發佈的代碼一些猜測:

兩個靜態函數以及仿函數使用成員d來決定排序的列。但d是一個實例變量,因此它不適用於靜態的任何內容。仿函數和靜態成員函數都不知道可能使用哪一個d,因爲每個實例有一個d

不使用C++ 11功能(lamdas)而做到這一點的最好方法是爲函數提供一個構造函數,該函數採用您計劃使用的d。這樣的事情:

struct compareMyDataFunctor : public binary_function<cl1*, cl1*, bool> 
{ 
    compareMyDataFunctor(unsigned int d) : d(d) {} 
    bool operator()(cl1* lhs, cl1* rhs) 
    { 
     return (lhs->coords[d] < rhs->coords[d]); 
    } 

    unsigned int d; 
}; 

這應該是訣竅。

有一些更多的事情你錯了,雖然張貼代碼:

  • 陣列應該使用類型size_t不是unsigned int索引。 std::vector s
  • std::binary_function實例化中的類型與方法中的實際類型不匹配(可能是減少代碼的問題)。
  • 不要使用using namespace std(我假設你從你的代碼中的聲明做到)。
  • 諸如這些的函數應該將參數作爲常量引用而不是值。

這就是我能想到的。下一次嘗試呈現short, self contained, complete examples,那麼人們將不必訴諸猜測。

1

錯誤是因爲您正在從比較器函數的靜態上下文中訪問非靜態成員d。使用第二種方法,在下面的方式:

  • 提供一個構造該結構,需要一個參數unsigned int並設置一個部件到該值。
  • 創建類型爲compareMyDataFunctor的對象,並將值d傳遞給構造函數。
  • 使用該對象進行排序(第三個參數爲std ::排序)
+0

我給unswer到LiKao,因爲他提供的代碼。我希望我能標出兩個答案。 解決方法:我將李考的代碼粘貼到cl2中,並按照你所說的去做。在主結構(cl2 :: struct)的一個實例中創建並用它作爲第三個參數。 說實話,我不是一個有經驗的程序員,甚至從來沒有聽說過函子。 謝謝大家。有效。 – 0gap