// Student.h: interface for the Student class.
//
//
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
#if !defined(AFX_STUDENT_H__A128B9F0_66AE_4C4C_B99F_970C1C5BB355__INCLUDED_)
#define AFX_STUDENT_H__A128B9F0_66AE_4C4C_B99F_970C1C5BB355__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class Student;
ostream& operator<<(ostream& os,const Student& _Student);
bool operator<(const Student& s1, const Student& s2);
// 由于编译器本身的问题,重载运算符的函数做友元的时候要先声明一下
// (此说法来自互联网),没有权威的说明,但是确实的这样,你可以看到
// test函数和myless类都没有任何问题
class Student
{
public:
Student();
virtual ~Student();
private:
char name[32];
int goal;
public:
Student(char *_name, int _goal)
{
strcpy(name, _name);
goal = _goal;
}
// 友元函数声明
friend static bool operator<(const Student& s1, const Student& s2);
friend static ostream& operator<<(ostream& os,const Student& _Student);
friend class myless;
friend static bool test(const Student& s1);
};
bool test(const Student& s1)
{
cout<< s1.goal << endl;
return true;
}
// 重载"<"实现泛型算法sort
bool operator<(const Student& s1, const Student& s2)
{
return s1.goal < s2.goal;
}
// 重载输出流迭代子
ostream& operator<<(ostream& os,const Student& _Student)
{
os<<_Student.name<<" "<<_Student.goal;
return os;
}
// 函数对象,用于升序排列(仿函数)
class myless
{
public:
bool operator()(const Student& s1, const Student& s2)
{
return s1.goal > s2.goal;
}
};
#endif // !defined(AFX_STUDENT_H__A128B9F0_66AE_4C4C_B99F_970C1C5BB355__INCLUDED_)
Main函数:
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include "Student.h"
using namespace std;
int main(int argc, char* argv[])
{
printf("Hello World!\n");
vector<Student> col1;
ostream_iterator< Student > output( cout, "\n" );
Student A1("xiao1", 99);
Student A2("xiao2", 23);
Student A3("xiao3", 53);
col1.push_back(A1);
col1.push_back(A2);
col1.push_back(A3);
cout << "Vector col1 contains: \n";
copy( col1.begin(), col1.end(), output ); // 输出初始列表容器col1中的元素
sort(col1.begin(),col1.end()); // 第一种调用形式
cout << "\nAfter sorted in ascending order col1 contains: \n";
copy( col1.begin(), col1.end(), output ); // 升序排序元素后列表容器col1中的元素
sort(col1.begin(),col1.end(),myless()); // 第二种调用形式使用标准函数对象
cout << "\nAfter sorted in descending ordercol1 contains: \n";
copy( col1.begin(), col1.end(), output ); // 降序排序元素后列表容器col1中的元素
cout<<endl;
col1.clear();
return 0;