Функция слияния.

Рубрика: C++, Дата: 24 June, 2013, Автор:

Реализуйте шаблонную функцию, которая выполняет слияние двух контейнеров.

Отето от сложненькая задачка. Тут сразу не понятно что нужно делать. Ну да ладно щас будем разбираться. Конечно понятно что делать, но для каких контейнеров нужно писать? Для стандартных чтоли? Отето ж от не ясно ничего сразу.

В общем сделал я простую функцию слияния, простая такая функция получилась, ничего в ней сложного нету, она просто принимает объект типа list и сливает его с имеющимся объектом.

Вот файл list.h:

//ob69vlenie list
#ifndef LIST_H
#define LIST_H

#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;

template<class T>
class list
{	
public:
	typedef T type_data;
	typedef size_t size_type;
	typedef T* iterator;
	//конструктор по умолчанию
	list():size_t(0){}
	//добавить элемент в конец списка
	void push_back(type_data n);
	//доступ к последнему элементу
	type_data& back();
	//доступ к первому элементу
	type_data& front();
	//добавление в начало списка
	void push_front(type_data n);
	//вывод размера
	size_type size(){return size_t;}
	//возврат указателя на первый элемент
	iterator begin(){return &mass[0];}
	//возврат указателя на элемент за последним
	iterator end(){return &mass[size_t];}
	//индексация
	type_data& operator[](int i);
	//функция выполняет слияние двух списков
	void splice(list& e);
	
private:
	type_data* mass;
	size_type size_t;
};

//добавить элемент в конец списка
template<class T>
void list<T>::push_back(type_data n)
{
	type_data* temp=mass;
	mass=new type_data[size_t+1];
	for(int i=0;i<size_t;i++)
		mass[i]=temp[i];
	mass[size_t++]=n;
}
//доступ к последнему элементу
template<class T>
typename list<T>::type_data& list<T>::back()
{
	return mass[size_t-1];
}
//доступ к первому элементу
template<class T>
typename list<T>::type_data& list<T>::front()
{
	return mass[0];
}
//добавление в начало списка
template<class T>
void list<T>::push_front(type_data n)
{
	type_data* temp=mass;
	mass=new type_data[size_t+1];
	mass[0]=n;
	for(int i=0,j=1;i<size_t;i++,j++)
		mass[j]=temp[i];
	size_t++;
	delete temp;
}
//индексация
template<class T>
typename list<T>::type_data& list<T>::operator[](int i)
{
	if(i>=size_t) exit(1);
	return mass[i];
}
//функция выполняет слияние двух списков
template<class T>
void list<T>::splice(list<T>& e)
{
	type_data* temp=mass;
	int r=size_t+e.size();
	mass=new type_data[r];
	int i=0;
	for(;i<size_t;i++)
		mass[i]=temp[i];
	for(int j=0;j<e.size();j++,i++)
		mass[i]=e.mass[j];
	size_t=r;
	delete temp;
}

#endif

Файл main.cpp:

#include <iostream>
using std::cout;
using std::endl;

#include "list.h"

int main()
{
	cout <<"hellow gacpada"<<endl;
	list<int> l;
	l.push_back(4);
	l.push_back(3);
	cout <<l.back()<<endl;
	cout <<l.front()<<endl;
	l.push_front(10);
	cout <<l.front()<<endl;
	cout <<l.back()<<endl;
	cout <<"l.size()= "<<l.size()<<endl;

	list<int>::iterator it;
	for(it=l.begin();it!=l.end();++it)
		cout <<*it<<' ';
	cout <<endl;

	cout <<l[0]<<' '<<l[1]<<' '<<l[2]<<endl;

	list<int> l1;
	l1.push_back(20);
	l1.push_back(30);
	l1.push_back(40);

	l.splice(l1);
	cout <<"l.size()= "<<l.size()<<endl;
	for(it=l.begin();it!=l.end();++it)
		cout <<*it<<' ';

	return 0;
}

Ну вот и все в принципе хоть что то создали. Решаем следующую.

[youtube]http://www.youtube.com/watch?v=1yth0IwA_m0[/youtube]

rss