2011-03-23 90 views
-2

數組在排序後保持不變。這怎麼可能?我可以看到健康的比較結果。std :: sort在std :: vector上進行比較,但從未替換

有擁有一個std ::向量模型類:

private: 
    std::vector<Contact> contacts; 

類接觸有:

  1. 即QString私有成員
  2. 即QString私有成員吸氣 - 的GetName()
  3. 處理成員的複製構造函數
  4. 處理成員的賦值運算符定義爲
  5. <操作如下:

bool Contact::operator < (const Contact& contact) const { 
    QString str1 = contact.GetName(); 
    QString str2 = this->GetName(); 
    bool b = (QString::compare(str1,str2) < 0); 
    return b; 
} 

排序時我調試這個方法,我找到了正確的「B」返回,每一次。名字被正確地檢索,被正確地比較,並且「b」返回碼總是正確的。

在擁有該向量類,我有一種方法......

void ContactsModel::sort() 
{ 
    qDebug("Before Sorting: size: %d", this->contacts.size()); 

    for (int i=0; i< this->contacts.size(); i++) 
    { 
    QString str = contacts[i].GetName(); 
    qDebug(str.toAscii()); 
    } 

    // trying to sort... 
    std::sort(this->contacts.begin(), this->contacts.end()); 

    // PROBLEM: Output here is identical to what I had before the sort. The vector is not sorted, not even close. It's 52 random names in the same order they were initially put in the vector. 

    qDebug("After Sorting: size: %d", this->contacts.size()); 
    for (int i=0; i< this->contacts.size(); i++) 
    { 
    QString str = contacts[i].GetName(); 
    qDebug(str.toAscii()); 
    } 
} 
+8

請發佈您的排序代碼。 – Richard 2011-03-23 15:23:18

+3

也許是因爲它已經排序? :)誰知道沒有看到問題的一個例子。 – 2011-03-23 15:25:20

+0

-1沒有發佈代碼,並提出問題,如果我們有第六感,當OP甚至不使用常識! – Nawaz 2011-03-23 15:33:54

回答

1

我發現了這個問題。

我的賦值操作符存儲在向量中的類是錯誤的。

我的賦值運算符沒有返回健康的「* this」,而是它聲明瞭一個新對象,用rhs數據初始化它並返回它。

所以效果如我所述。正確的比較,但是由於這個錯誤沒有「交換」。

1

該載體已經排序!

+0

什麼? 'std :: vector'已經排序? – Nawaz 2011-03-23 15:31:23

+0

不幸的是,沒有。它不是排序..我希望這是問題 – JasonGenX 2011-03-23 15:36:45

+0

@Nawaz:通過使用感嘆號(砰)我假設@Victor是諷刺。 – 2011-03-23 15:37:24

0

剛入手:

  1. 您的比較仿函數(或運營商<,或者更少)可能是不正確的。

  2. 您可以傳遞不正確的迭代器對(v.begin,v.begin())。

  3. 它可能已經排序。

+0

我正在檢查比較結果。這很健康。我將v.begin(),v.end()傳遞給sort方法。我的矢量絕對沒有排序。這就是爲什麼它是如此莫名其妙。 – JasonGenX 2011-03-23 15:38:35

0

陣列停留在排序後的相同。

什麼數組?你是從數組初始化一個向量嗎?在這種情況下,矢量具有自己的數據副本,排序矢量對數組沒有影響。例如:

int array[] = {5, 2, 7, 3}; 
std::vector<int> vec(array + 0, array + 4); 
std::sort(vec.begin(), vec.end()); 

現在矢量將包含數字{2, 3, 5, 7},但數組將保持不變。如果你想對陣列本身進行排序,只要這樣做:

int array[] = {5, 2, 7, 3}; 
std::sort(array + 0, array + 4); 
+0

向量通過向其中推入50個名稱進行初始化。然後與推送的類相同,調用std :: sort。我應該說VECTOR保持不變。忘記數組。 – JasonGenX 2011-03-23 16:33:39