Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC_Lect.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
15 Мб
Скачать
☆

21.8.Сортировка массива объектов пользовательского класса

// AlgTest.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include "AlgTest.h"

#include <Conio.h>

#include <algorithm> // for_each, find, find_if

#include <vector>

#include <functional> // unary_function

#include <time.h>

/////////////////////////////////////////////////////////////////////

// Сортировка массива объектов пользовательского класса

/////////////////////////////////////////////////////////////////////

/* В классе, имеющем в качестве член-данных указатели,

надо обязательно выполнить перегрузку операции присвоить

и корректно реализовать собственный конструктор копирования.

*/

struct CMycls // пользовательский класс

{

int *p;

CString Name1;

char * Name2;

float Price;

CMycls()

{

p=new int [1024];

TRACE("CMycls()\n");

}

~CMycls()

{

delete []p;

TRACE("~CMycls()\n");

}

CMycls(const CMycls & orig)

{

this->Name1=orig.Name1;

this->Name2=orig.Name2;

this->Price=orig.Price;

this->p=new int [1024];

}

CMycls & operator=(const CMycls & orig)

{

this->Name1=orig.Name1;

this->Name2=orig.Name2;

this->Price=orig.Price;

if(p) delete []this->p;

this->p=new int [1024];

return *this;

}

};

// PrintArr - печать элементов вектора

void PrintArr(vector <CMycls> & Arr)

{

for(int i=0;i<Arr.size();i++)

{

wcout<<Arr[i].Name1.GetBuffer();

cout<<' '<<Arr[i].Name2<<' '<<Arr[i].Price<<endl;

}

cout<<endl;

}

// MyCmp - функция предикат, выполняющая сравнение только по одному

// член-данному класса. Если для класса CMycls перегрузить операцию сравнения,

// то можно обойтись без функции MyCmp

bool MyCmp(CMycls& e1,CMycls& e2)

{ // по убыванию (я..а)

return strcmp(e1.Name2,e2.Name2)==1;

}

// BestCmp - функциональный объект, выполняющий сравнение по двум

// член-данным класса в зависимости от значения статического член-данного FNum

class BestCmp

{

public:

static int FNum;

bool operator ()(const CMycls & e1,const CMycls & e2)

{

switch(FNum)

{

case 2: return strcmp(e1.Name2,e2.Name2)==1;

case 3: return e1.Price<e2.Price;

default: return false;

}

}

};

int BestCmp::FNum;

void DemoOwnClass()

{

vector <CMycls> Arr;

for(int i=0;i<3; i++)

{

CMycls * temp=new CMycls;

Arr.push_back(*temp);

delete temp;

// Arr.push_back(*(new CMycls));

}

Arr[0].Name1="aName1";

Arr[0].Name2="aName2";

Arr[0].Price=123.4;

Arr[1].Name1="bName1";

Arr[1].Name2="bName2";

Arr[1].Price=323.4;

Arr[2].Name1="cName1";

Arr[2].Name2="cName2";

Arr[2].Price=223.4;

//Arr[2]=temp;

cout<<"Arr.size()="<<Arr.size()<<' '<<"Arr.capacity()="<<Arr.capacity()<<endl;

//Arr.size()=3 Arr.capacity()=3

PrintArr(Arr);

//aName1 aName2 123.4

//bName1 bName2 323.4

//cName1 cName2 223.4

swap(Arr[0],Arr[1]);

CMycls swap;

swap=Arr[0];

Arr[0]=Arr[1];

Arr[1]=swap;

PrintArr(Arr);

//bName1 bName2 323.4

//aName1 aName2 123.4

//cName1 cName2 223.4

// сортировка по член-данному Name2

sort(Arr.begin(),Arr.end(),MyCmp);

PrintArr(Arr);

//cName1 cName2 223.4

//bName1 bName2 323.4

//aName1 aName2 123.4

// использование функционального объекта для сортировки по член-данному Price

BestCmp FObj;

BestCmp::FNum=3;

sort(Arr.begin(),Arr.end(),FObj);

PrintArr(Arr);

//aName1 aName2 123.4

//cName1 cName2 223.4

//bName1 bName2 323.4

// Arr.erase(Arr.begin(),Arr.end()); - необязательно

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]