Класс Map на классе Assoc.

Рубрика: C++, Дата: 6 April, 2013, Автор:
Tags:

Реализуйте простой ассоциативный массив Map, основанный на классе Assoc из параграффа 11.8. Убедитесь, что Map работает корректно как для С-строк, так и для string в качестве типа key. Убедитесь, что Map работает корректно как для типов с умолчательными конструкторами, так и для типов без оных. Обеспечьте возможность итерации по элементам контейнера Map.

Да у меня такое чувство что здесь предется повозится. За стлный map можете почитать от здесь: http://www.kselax.ru/2013/03/rabota-s-associativnym-massivom-map/   Да я его уже рассматривал. Приходилось. Хорошо когда рассматривал тему и инфу не нужно гуглить и искать в интернете.

Да видимо нам нужно построить класс Map. А что же такое за класс Assoc я если честно и не помню, придется подчитать. Ладно пошол я щас разбираться. Походу эту задачку я быстро и не сделаю.

Вроде задачку реши, по всем пунктам проверил, токо по одному не проверял “Убедитесь, что Map работает корректно как для типов с умолчательными конструкторами, так и для типов без оных.”   от по этому пункту не проверял, но это не так важно главное по остальным все работает.

Вот код файл main.cpp:

//klacc Map na ocnove klacca Assoc
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
#include <vector>
using std::vector;
#include <string>
using std::string;
#include <cstdlib>
using std::exit;

template<typename C>
class Assoc
{
	struct Pair
	{
		C name;
		double val;
		Pair(C n=" ",double v=0):name(n),val(v){}
	};

	vector<Pair> vec;

	Assoc(const Assoc&);//private-dl9 predotvracheni9 kopirovani9
	Assoc& operator=(const Assoc&);//private-dl9 predotvracheni9 kopirovani9
	int index;

public:
	Assoc():index(0){}
	const double& operator[](const C&);
	double& operator[](C&);
	void print_all() const;
	double operator*()
	{
		//cout <<"mu v razumenovanii"<<endl;
		typename vector<Pair>::iterator p=vec.begin();
		p+=index;
		return p->val;
	}
	double operator++()
	{
		typename vector<Pair>::iterator p=vec.begin();
		index++;
		p+index;
		return p->val;
	}
	void begin()
	{
		index=0;
	}
	bool end()
	{
	//cout <<endl<<vec.size()<<' '<<index<<endl;

		if(index==vec.size())
			return false;

		return true;
	}
};

template<typename C>
double& Assoc<C>::operator[](C& s)
{
	for(typename vector<Pair>::iterator p=vec.begin();p!=vec.end();++p)
		if(s==p->name)return p->val;
	vec.push_back(Pair(s,0));//nachal6noe znachenie 0
	return vec.back().val;//vozvrat poclednego elementa
}

template<typename C>
void Assoc<C>::print_all() const
{
	for(typename vector<Pair>::const_iterator p=vec.begin();p!=vec.end();++p)
		cout <<p->name<<" : "<<p->val<<'\n';
}

//cozdaem klacc Map na ocnove Assoc
template<typename C>
class Map : public Assoc<C>
{
	public:
		Map(){}
};

int main()
{
	string buf;
	Map<string> vec;
	buf="hellow";

	vec[buf]=3;
	buf="chert";
	vec[buf]=5;

	vec.print_all();

	//proverka iteratorov
	cout <<*vec<<endl;
	++vec;
	cout <<*vec<<endl;
	cout <<endl;
	vec.begin();
	for(;vec.end();++vec)
		cout <<*vec<<' ';
	cout <<endl;

	return 0;
}

Мб еще, что то добавить, но фиг его знает наверно ничего.

Катя самбука королева. 🙂 🙂

[youtube]http://www.youtube.com/watch?v=h-CIslZY528[/youtube]

rss