我有课,这个班级包含一个数字。我有一个包含类的对象指针的向量。我想根据他们的数字对这些对象进行排序。我怎样才能做到这一点? 谢谢你的回答。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Course
{
public:
Course (int code, string const& name) : name(n), code(c) {}
int getCourseCode() const { return code; }
string const& getName() const { return name; }
private:
string name;
int code;
};
int main()
{
vector<Course*> cor;
vector<Course*>::iterator itcor;
cor.push_back(new Course(3,"first"));
cor.push_back(new Course(2,"sekond"));
cor.push_back(new Course(4,"third"));
cor.push_back(new Course(1,"fourth"));
cor.push_back(new Course(5,"fifth"));
sort (cor.begin(), cor.end());
for (itcor=cor.begin(); itcor!=cor.end(); ++itcor) {
cout << *itcor << ' ';
}
}
例如,当我想要根据他们的地址对他们进行排序的对象进行排序时。
答案 0 :(得分:4)
您需要为std::sort
方法提供自定义比较器类或函数,以使其不按地址排序。
template <class RandomAccessIterator, class Compare>
void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
其中comp
可以定义为:
bool comparer(const Course* x, const Course* y) { /*compare*/ }
//or
struct comparer {
bool operator() (const Course* x, const Course* y) { /*compare*/ }
} comparerObject;
并将排序称为:
std::sort(cor.begin(), cor.end(), comparer); //method alternative
或
std::sort(cor.begin(), cor.end(), comparerObject); //class alternative
那,或者不在vector
中保留指针。从您发布的代码中,您不确定是否确实需要指针:
vector<Course> cor;
应该足够了。
答案 1 :(得分:0)
您可以通过三种方式执行此操作:
1)重载&lt;运算符,并调用std :: sort算法。代码如下所示:
bool operator<(Course *a, Course *b) const {
// do comparison
return A_BOOL_VALUE;
}
std::sort(array_of_courses.begin(),array_of_courses.end());
第一种方法是错误的,因为你不能重载&lt;指针操作符。
2)创建一个比较函数,然后调用std::sort
的第二个版本。代码如下所示:
bool compare(Course *a,Course *b) {
// do comparison
return A_BOOL_VALUE;
}
std::sort(array_of_courses.begin(),array_of_courses.end(),compare);
3)创建一个比较类,让()
运算符重载,然后调用std::sort
的第三个版本。代码:
struct Compare {
bool operator()(Course *a, Course *b) {
// do comparison
return A_BOOL_VALUE;
}
};
std::sort(array_of_courses.begin(),array_of_courses.end(),Compare);
注意:排序功能位于algorithm
头文件中。