2种不同的种类,1种仿函数

时间:2014-03-05 21:43:17

标签: c++ sorting stl functor

我有一个仿函数用于比较2个值,如果这两个值相等,则依赖于按字母顺序排序。

以下是名为test的类的示例仿函数,该类具有属性访问器GetValueGetName

struct test_comp {
    bool operator() (const test* a, const test* b) const {
        if(a->GetValue() == b->GetValue()) {
            return a->GetName() < b->GetName();
        } else {
            return a->GetValue() > b->GetValue();
        }

    }
};

这实际上会按最大value对STL容器进行排序,然后在每个值中按字母name

排序

然后我想输出两件事:

STL容器的前N个元素和STL的最后N个元素,如果值相等,则按字母顺序排序。

这是我的代码,使用STL列表test_list

test_list.sort(test_comp);

cout << "First 5:" << endl;
n = 1;
for (auto it = test_list.begin(); it != test_list.end(); ++it) {
    cout << (*it)->GetName() << " " << (*it)->GetValue() << endl;
    if(++n > 5) {
        break;
    }
}

cout << "Last 5:" << endl;
m = 5;
for (auto it = test_list.rbegin(); it != test_list.rend(); ++it) {
    cout << (*it)->GetName() << " " << (*it)->GetValue() << endl;
    if(--m < 1) {
        break;
    }
}

例如,请考虑以下列表:

name  value
A     1
B     4
C     1
A     3
B     3
C     3
A     4
B     1
C     4

正确输出:

前5:

name  value
A     4
B     4
C     4
A     3
B     3

最后5:

name  value
A     1
B     1
C     1
A     3
B     3

我的输出:

前5:

name  value
A     4
B     4
C     4
A     3
B     3

最后5:

name  value
C     1
B     1
A     1
C     3
B     3

正如你在“最后5”中看到的那样,字母顺序排序得以维持,当反向迭代时,字母顺序正在下降,当我仍然希望它升序时。我知道如何做我想做的唯一方法是使用2个仿函数和2种。我很好奇是否有办法使用1个仿函数和1种颜色来完成它。

编辑1:

修正了与a。比较的一些拼写错误。

编辑2:

更清楚输出差异

1 个答案:

答案 0 :(得分:0)

我不确定,但这看起来非常错误

bool operator() (const test* a, const test* b) const {
    if(a->GetValue() == a->GetValue()) { //comparing a to a?
        return a->GetName() < b->GetName();
    } else {
        return a->GetValue() > a->GetValue(); //comparing a to a?
    }

}

也许如果你将ab进行比较,你会得到更好的结果。

编辑完成后,现在您的&#34;正确输出&#34;看起来很疯狂,对我来说没有任何意义,你的&#34;我的输出&#34;看似正确,只是相反。因为,你知道,你反过来打印它。问题是你要反向打印最后5个。