2011-03-23 143 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