daviddoria 334 Posting Virtuoso Featured Poster

I've seen a few questions about this floating around here (mostly from me :) ) but I finally got this is into a nice working form - maybe it will be useful for someone.

It is called like this:

void TestParallelSort()
	vector<double> Numbers;
	vector<string> Names;

	Tools::ParallelSort(Numbers, Names);
	output should be
	1.2 Joe
	3.4 David
	4.5 Hayley

And here is the code:

template <typename T>
	struct NumberedItem
		unsigned int index;
		T Item;

	template <typename T>
	bool operator<(NumberedItem<T> NI1, NumberedItem<T> NI2)
		//return NI1.index < NI2.index;
		return NI1.Item < NI2.Item;
	template <class T, class S>
	void ParallelSort(vector<T> &Things1, vector<S> &Things2)
		//this function sorts Things1 and reorders Things2 so that it is in the same order as the sorted Things1
		assert(Things1.size() == Things2.size());
		unsigned int NumThings = Things1.size();
		//create the sortable objects
		vector<NumberedItem<T> > Pairs(NumThings);
		for(unsigned int i = 0; i < NumThings; i++)
			Pairs[i].index = i;
			Pairs[i].Item = Things1[i];
		sort(Pairs.begin(), Pairs.end());
		vector<unsigned int> SortedIndices(NumThings);
		for(unsigned int i = 0; i < NumThings; i++)
			SortedIndices[i] = Pairs[i].index;
		vector<T> Things1Out(NumThings);
		vector<S> Things2Out(NumThings);
		for(unsigned int i = 0; i < NumThings; i++)
			Things1Out[i] = Pairs[i].Item;
			Things2Out[i] = Things2[SortedIndices[i]];
		//return by reference
		Things1 = Things1Out;
		Things2 = Things2Out;