
#include <iostream>
#include <string>
#include<algorithm>
#include<vector>


using namespace std;

// struct comp
// {

	// bool operator()( std::string lhs, std::string rhs)
	// {
		// std::transform(lhs.begin(), lhs.end(),lhs.begin(), ::tolower);
		// std::transform(rhs.begin(), rhs.end(),rhs.begin(), ::tolower);
		// return lhs < rhs;
	// }
// };

bool char_comp(char lhs, char rhs)
{
    char lhs_lower = std::tolower(lhs);
    char rhs_lower = std::tolower(rhs);
    if (lhs_lower == rhs_lower)
        return rhs > lhs;
    return lhs_lower < rhs_lower;
}

bool string_comp(std::string const & lhs, std::string const & rhs)
{
    return std::lexicographical_compare(
        lhs.begin(), lhs.end(), rhs.begin(), rhs.end(),
        char_comp);
}


int main(){


std::string str;
std::vector<std::string> v{
"This is a test",
"this is a test",
"Cats",
"cats",
"this thing" };


std::sort(v.begin(), v.end() , string_comp);

for(auto &x: v)
std::cout<<x<<std::endl;
}
