c ++ std :: sort工作错误

时间:2015-11-15 23:33:04

标签: c++ sorting vector

我正在尝试根据xValue对此进行排序:

Item
side: L
xValue:2
label: 0
yValue: 50

Item
side: R
xValue:10
label: 0
yValue: 50

Item
side: L
xValue:35
label: 1
yValue: 20

Item
side: R
xValue:55
label: 1
yValue: 20

Item
side: L
xValue:30
label: 2
yValue: 60

Item
side: R
xValue:45
label: 2
yValue: 60

Item.cpp中,我重载了运算符<

bool Item::operator < (const Item& itm) const{
    return (xValue < itm.xValue);
}

这就是我使用std::sort的方式:

sort(mainList.begin(), mainList.end());

但结果是:

Item
side: L
xValue:2
label: 0
yValue: 50

Item
side: L
xValue:35
label: 1
yValue: 20

Item
side: R
xValue:10
label: 0
yValue: 50

Item
side: R
xValue:55
label: 1
yValue: 20

Item
side: L
xValue:30
label: 2
yValue: 60

Item
side: R
xValue:45
label: 2
yValue: 60

这里有什么问题?

编辑:主列表:

vector<Item*> mainList;

mainList插入:

if (myfile.is_open()){
    // read building count
    getline(myfile,line);
    buildingCount = atoi(split(line)[0].c_str());

    // read buildings
    for (int b=0; b < buildingCount; b++){
        getline(myfile,line);
        mainList.push_back(new Item('L', atoi(split(line)[0].c_str()), b, atoi(split(line)[1].c_str())));
        mainList.push_back(new Item('R', atoi(split(line)[2].c_str()), b, atoi(split(line)[1].c_str())));
    }
}

3 个答案:

答案 0 :(得分:5)

您需要一个仿函数进行比较,并将其作为第三个参数进行排序:

http://www.cplusplus.com/forum/general/59164/

struct Compare {
    bool operator() (const Item* left, const Item* right) const { 
       return left->xValue < right->xValue;
    }
}

sort(mainList.begin(), mainList.end(), Compare());

答案 1 :(得分:2)

std::sort函数可以正确排序,但它只会按照您的要求进行排序。

它对mainList中的元素进行排序。最常见的两个错误是:

  1. 您排序mainList,但打印的是mainList
  2. 的其他副本
  3. 您根据其他标准进行排序。如果mainList不是Item的容器,而是Item*std::shared_ptr<Item>的其他类型,则会发生这种情况。
  4. 这些只是猜测,但如果没有完整的问题示例,我们除了提供非常一般的答案之外,我们做的不仅仅是。

答案 2 :(得分:0)

因为我使用了任何内置的排序,但是我觉得你的比较器可能与你想要的不同。

尝试告诉sort使用大于

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );



// sort using a standard library compare function object
std::sort(s.begin(), s.end(), std::greater<int>());

http://en.cppreference.com/w/cpp/algorithm/sort