2014-01-12 44 views
0

我有以下結構:排序性病對象的矢量::排序()

struct Invariant 
{ 
public: 
    Invariant(int d, int dc) 
    : Dim(d), DimCoupl(dc) {} 
    void addTerm(int coeff, intVec pows) 
    { 
     Powers.push_back(pows); 
     Coefficients.push_back(coeff); 
    } 

    int Dim, DimCoupl; 
    std::vector<long> Coefficients; 
    std::vector<intVec> Powers; 
}; 

哪裏IntVec是,是基於從Boost庫陣列INTS的自定義數組。

我有一個stl這些對象的向量,我想按它們的Coefficients向量的元素數量排序它們。所以我定義:

bool compInv(const Invariant &one, const Invariant &two) 
{ 
    return (one.Coefficients.size() < two.Coefficients.size()); 
} 

並使用std::sort()std::stable_sort()排序的矢量。之後檢查矢量是否排序,但好像std::vector<intVec>的內容更改了權力。此外,std::sort()std::stable_sort()似乎以不同的方式改變它們。什麼可能導致這個?

編輯:INTVEC的定義:

typedef blitz::Array<int,1> intVec; 

我用,因爲它們更容易初始化,比普通陣列,這是非常重要的,因爲我創造了很多這些對象,每包含的很多這些載體。

+3

需要更多的SSCCE。 –

+2

如果發生這種情況,那麼你的'intVec'類(特別是它的'swap'或賦值操作符)被破壞。你爲什麼要自己動手? – jalf

+0

我以爲'std :: sort'使用'std :: swap'。這可能是交換你的IntVec沒有做你認爲的事情(即你的IntVec類被破壞了)。 – Walter

回答

2

如果沒有SSCCE,很難說出代碼有什麼問題,但看起來像是通過使用來自過時庫(blitz ++)的類來捕獲它,該庫似乎已停止進一步的開發/更新/調試多年前。

由於blitz::Array<int,1>是整數的一個動態分配的一維數組,就仔細地用std::vector<int>相反,當你得到充分的支持(正確的交換)和C++ 11個功能(移動語義)沒有優勢。因此,首先要嘗試的是

typedef std::vector<int> intVec; 

並查看症狀是否持續。如果這涉及到對代碼的太多更改,請先嚐試使用SSCCE(最初必須顯示與您的代碼相同的症狀)。

+0

我要試試這個,但它會花費我一段時間。它要求我改變我的代碼的很大一部分,所以我不能立即看到它是否能正常工作。謝謝! – RobVerheyen

+0

@RobVerheyen不應該要求你做出很多改變:這是一個簡單的'typedef'。你還需要改變什麼?爲了測試這個問題,你只需要編譯幾個文件。此外,您可以在承諾更改所有代碼之前生成SSCCE並在其中進行更改。 – Walter

+0

你可能是對的,但這是完全擺脫使用閃電庫的好機會。我在代碼中的很多其他地方使用它,更具體地說,通過使用其他intVecs/other Blitz類型的方法創建對象中的intVecs,所以我不妨將它們全部替換掉​​。 – RobVerheyen