/*
 * Some more exercises with lists.
 */
#include <list>
#include <iostream>
using namespace std;
/*
 * Print the contents of the list.  Notice that, since we don't
 * change the list, it's sent as const reference.
 */
void print(const list<int> &list)
{
        // The parameter is a plain int since we're not
        // changing the list.
        for(int i: list)
                cout << i << " ";
        cout << endl;
}
/*
 * Reverse the contents of the list.  Notice that since we 
 * do change the list, it's sent as plain reference.
 */
void reverse(list<int> &data)
{
        list<int> backwards;
        // Drain list into backwards, reversing the order.
        while(!data.empty()) {
                // Put the first item from list onto the front of
                // backwards, then remove it from list.
                backwards.push_front(data.front());
                data.pop_front();
        }
        // Move the contents of backwards back into now-empty list.  Using
        // swap avoids copying the list.
        data.swap(backwards);
}
int main()
{
        // Lists (and vectors and other things) can be initialized with
        // a bracket-enclosed list.
        list<int> l1 = { 8, 7, 12, 22, 19, -17, 12, 3 };
        print(l1);
        reverse(l1);
        print(l1);
        // Lists allow insertion.  Insert adds in front of the indicated
        // location, but the iterator remains valid.  So let's split all
        // the even ones.
        for(auto scan = l1.begin(); scan != l1.end(); ++scan) {
                if(*scan % 2 == 0) {
                        auto half = *scan / 2;
                        l1.insert(scan, half);
                        *scan = half;
                }
        }
        print(l1);
        cout << endl;
        // You can also send a list initalizer as the value of a list
        // (or vector, etc)
        print({4, 9, 22, 1, 18});
        cout << endl;
        // Let's try incrementing the contents of the list.
        for(int i: l1) { i++; }
        print(l1);
        // Since that didn't work, let's try it so that it does.
        // In the first one, each i value was a copy of the list
        // member.  Here it's an alias.
        for(int & i: l1) { i++; }
        print(l1);
}
This demonstrates the use of initializer lists (curly-brace
             lists) to give initial values for list, and also some things
	     about the for-each construct.