#include <iostream>
#include <string>
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

using TStringList = vector< string >;

struct SPISOK_STRUCT
{
int sorting_field;             //по этому полю будет сортировка
TStringList *spisok;

    SPISOK_STRUCT(void)  { sorting_field=0; spisok = new TStringList; }
    ~SPISOK_STRUCT(void) { delete spisok; spisok=NULL; }
    SPISOK_STRUCT(const SPISOK_STRUCT& x)
    {
      spisok = new TStringList;
      sorting_field = x.sorting_field;
      for(int i=0; i < x.spisok->size(); i++)
         spisok->push_back( x.spisok->at(i) );
    }

    SPISOK_STRUCT& operator= (const SPISOK_STRUCT& x)
    {
      if ( &x == this ) {
        printf( "uuups\n" );
      }
      sorting_field = x.sorting_field;
        spisok->clear();
        for(int i=0; i < x.spisok->size(); i++)
             spisok->push_back( x.spisok->at(i) );
      return *this;
    }

   friend bool operator< (const SPISOK_STRUCT &x, const SPISOK_STRUCT &y)
   {
      bool ret = (x.sorting_field < y.sorting_field);
      return ret;
   }
};

/*---------------------------------------------*/
int main()
{
string astr;
vector<SPISOK_STRUCT> spiski;  //вектор списков

   spiski.clear();
   for(int i=1; i<=4; i++)  //делаем 4 списка по 2 строки в каждом
     {
     SPISOK_STRUCT x;
        for(int j=1; j < 3; j++)
         {
          //AnsiString astr = AnsiString("spisok N'") + i + " line" + j;
          string astr = string("spisok N'") + to_string( i ) + " line" + to_string( j );
          x.spisok->push_back(astr);
         }

     x.sorting_field = i;
     spiski.insert(spiski.end(), x);
     }

     //тестовый вывод строки из 4-го списка
astr = spiski[3].spisok->at(0);
printf("stable_sort1: %s\n", astr.c_str());

 stable_sort(spiski.begin(), spiski.end());
     //тестовый вывод строки из 4-го списка
astr = spiski[3].spisok->at(0);
printf("stable_sort2: %s\n", astr.c_str());

return 0;
}