1. 程式人生 > >利用c++11tuple實現多級排序

利用c++11tuple實現多級排序

最近在做儲存過程改造為記憶體資料庫的服務的過程中,遇到了很多需要進行排序的地方,而利用sql語言本身的特性,可以很方便的對資料庫查找出來的資料進行排序,而在使用c++語言進行改造的過程中,每次需要進行排序的地方,使用lambda或者函式物件去實現相應的功能,對於儲存中只針對少許欄位進行排序時,還可以很方便的實現,但是當涉及到欄位很多時,需要寫很多的邏輯判斷,而且程式碼的閱讀性很差,因此,想著有沒有什麼辦法能夠很方便的對基本的資料型別一次性完成排序,或者能夠實現一個通用的介面,完成排序的功能。剛開始想到的是利用c++11提供的新特性,不定引數模板來實現多級排序的功能,後來還是放棄了這個想法。也許是自己對其不夠了解,發現這種方法自己沒有想出來,後來瞭解到c++11中的tuple功能,於是很方便的解決了這個問題。
class student
{
public:
	student():age(0), score(0), height(0)
	{
		memset(name, 0, sizeof(name));
	}
public:
	int age;
	int score;
	double height;
	char name[64];
};

struct compare
{
	bool operator() (const student* __x, const student* __y)
	{
		std::tuple<int, int, double, std::string> t1;
		std::tuple<int, int, double, std::string> t2;

		t1 = std::make_tuple(__x->age, __x->score, __x->height, __x->name);
		t2 = std::make_tuple(__y->age, __y->score, __y->height, __y->name);

		if (t1 < t2)
			return true;
		else
			return false;

	}
};

int main(int argc, char* argv[])
{
	student s1;
	s1.age = 12;
	s1.score = 88;
	s1.height = 54.5;
	strcpy_s(s1.name, "python");

	student s2;
	s2.age = 12;
	s2.score = 88;
	s2.height = 54.5;
	strcpy_s(s2.name, "hello");

	student s3;
	s3.age = 13;
	s3.score = 87;
	s3.height = 54.5;
	strcpy_s(s3.name, "python");

	std::vector<student*> vec;
	vec.push_back(&s1);
	vec.push_back(&s2);
	vec.push_back(&s3);

	std::sort(vec.begin(), vec.end(), compare());

	for(auto record : vec)
	{
		cout << "age" << record->age << "score" << record->score << "height" << record->height << "name" << record->name << endl;
	}

	system("pause");
	return 0;
}