#include <algorithm>
#include <iomanip>
#include <ios>
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <cctype>
#include<list>

using std::cin;             using std::sort;
using std::cout;            using std::streamsize;
using std::endl;            using std::string;
using std::setprecision;    using std::vector;
using std::ifstream;	    using std::sort;
using std::list;

bool alpha_compare(const string& a, const string& b);
void show_string_vec(const vector<string> & v);
void show_string_list(const list<string> & ls);

int main()
{
vector<string> words;
list<string> word_list;
string current;
ifstream infile("blah.txt");
if(!infile)
{
	cout<<"Unable to open infile.\n";
	return 1;
}
while(infile>>current)
{
	words.push_back(current);
	word_list.push_back(current);
}
cout<<"Comparing 'Zebra' and 'aardvark' with "
	<<"our case-insensitive comparison gives "
	<<alpha_compare("Zebra","aardvark")<<endl;

cout<<"Our text file contains the words \n";
show_string_vec(words);
cout<<endl;

cout<<"\nWhen sorted with the two argument sort, get \n";
sort(words.begin(),words.end());
show_string_vec(words);
cout<<endl;

cout<<"\nSort with three argument sort, and case insensitive comparison:\n";
sort(words.begin(),words.end(), alpha_compare);
show_string_vec(words);
cout<<endl;

cout<<"\nSort with three argument list sort, "
	<<"and case insensitive comparison:\n";
//"sort(word_list.begin(),word_list.end());" won't work. This algorithm requires
// a randon access iterator.
word_list.sort(alpha_compare);
show_string_list(word_list);
cout<<endl;




return 0;
	
	
}
bool alpha_compare(const string& a, const string& b)
{
	string a1=a, b1=b;
	for(string::size_type i=0; i!=a.size(); i++)
		a1[i]=tolower(a[i]);
	
	for(string::size_type i=0; i!=b.size(); i++)
		b1[i]=tolower(b[i]);

	return a1<b1;
}

void show_string_vec(const vector<string> & v)
{
	for(vector<string>::size_type i=0; i!=v.size();i++)
cout<<v[i]<<" ";
	return;
}

void show_string_list(const list<string> & ls)
{
	for(list<string>::const_iterator it=ls.begin();
			it!=ls.end(); it++)
		cout<<*it<<" ";
	return;
}
