Vector and List - Part 2

◀ Vector and List - Part 1▶ Queue and Stack
Amazon There are two functions provided by #include <algorithm> I want you to know about because at times they can be very useful: random_shuffle() and sort(). They both require that the container support random access, such as a vector and deque. The random_shuffle() takes two iterators specifying a range and rearranges the contents within that range arbitrarily. So if hollywood is an instance of vector<Star>, you can do
random_shuffle(hollywood.begin(), hollywood.end());
to randomize the order of elements in hollywood. There are two versions of sort(). The first one takes two iterators that specify a range and sorts the contents within that range based on the operator <. If the container elements are user-defined types, then you need to define operator<() that returns a bool. The following is an example of operator<() definition:

bool operator<(Star star, Star star2) {
	if(star.wealth < star2.wealth)
		return true;
	else if(star.wealth == star2.wealth && star.height < star2.height)
		return true;
	return false;
This function returns true if the first star is less wealthy than the second one, or if they are equally wealthy the first star is shorter; it returns false otherwise. Here is the function call to use sort():
sort(hollywood.begin(), hollywood.end());
After sorting is done, the first element in hollywood will be the least wealthy.

The second version of sort() takes two iterators that indicate a range and a third argument which is a function address so that sorting is done based on that function instead of operator <. The following is such a function:
bool newSort(Star star, Star star2) {
  if(star.wealth < star2.wealth)
    return true;
  return false;
If you use newSort() to sort, then the first element of the resulting vector will be the least wealthy. But if there are more than one such star, there is no knowing how they are ordered. Here is a function call to use newSort() to sort:

sort(hollywood.begin(), hollywood.end(), newSort);
Now let’s see a program illustrating how to use list:
#include <iostream>
using namespace std;
#include <list>

template <typename T>
ostream & operator<<(ostream & os, list<T> a){
	list<T>::iterator lii;
	for(lii = a.begin(); lii != a.end(); lii++)
		os << *lii << ' ';
	return os;

int main() {
list<int> l1; list<int> l2(6,3); list<int> l3(l2); int temp[] = {8,4,1,3}; l1.insert(l1.end(), temp, temp+4); l3.insert(l3.begin(), temp, temp+3); cout << "List #1: " << l1 << endl; cout << "List #2: " << l2 << endl; cout << "List #3: " << l3 << endl; l3.splice(l3.begin(), l1); cout << "List #3 after splice: " << l3 << endl; l3.remove(1); cout << "List #3 w/t 1: " << l3 << endl;
l3.sort(); cout << "List #3 after sort: " << l3 << endl; l3.unique(); cout << "List #3 after unique: " << l3 << endl; l1.insert(l1.end(), temp, temp+4); l1.sort(); l3.merge(l1); cout << "List #3 after merge: " << l3 << endl; l3.unique(); cout << "List #3 after unique: " << l3 << endl; return 0; }
Run the program and you should pretty much understand each line of output. List provides functions such as merge() and sort() which can prove helpful at times.

One example is that a group of 10 people want to buy lottery, which consists of 6 numbers. You can receive 6 numbers from each of them and then use sort(), merge(), and unique() to get a clean sequence of unique numbers, which come from all 10 people’s opinions.

Another example is that you have two or more dictionaries and you want to combine them all into one single dictionary by removing identical entries via sort(), merge(), and unique().

Next we’ll take a look at queue and stack, two of the rudimentary STL container classes which exhibit important computing concepts!
◀ Vector and List - Part 1▶ Queue and Stack

Questions? Let me know!