Rosyjska szkołą programowania 2,przesunięcie bitowe

0

Witam to znowu ja pewnie kojarzycie mnie z zadań od Kochanej ukraińskiej prowadzącej zajęcia c++.
Mianowicie mam taki problem muszę zaimplementować w tym szablonie uogólniony algorytm odejmowania bitowego lecz nie mam pomysłu jak to zrobić kombinowałem z "<<" lecz to raczej nie to ponieważ po zamknięciu okienka wywala error.
Oto screen z szablonu
screenshot-20190528213324.png

1

No dobra ale co ma robic ten uogólniony algorytm odejmowania bitowego ?

0

screenshot-20190528214352.png
Tak jest to opisane :(

0

Danymi z podanej tablicy.
Szablon wczytuje tablice oraz jej rozmiar.
Na każdym elemencie tablicy ma zostać wykonana funkcja set_xor i wynik ma zostać nadpisany na oryginalnej tablicy.

0

Pętla chyba w drugą stronę (first++).
Różnica symetryczna to ^ a nie <<.
A ten Pridicate w set_xor_if(): if(Functor(*result)){*result ^= *first;}?

0

Ten kod jest nieprawidłowy, bo w algorytmy w tej formie zwykle są używane tak, że last wskazuje poza kontener.
Czyli ta funkcja użyta standardowo może prowadzić do Undefined behavior albo do nieoczekiwanej wartości.

Poza tym co to ma wspólnego z xor?

0

Dobra mniejsza z tamtym zadaniem jakoś rozwiązałem teraz przyszłą kolej na szablonową listę dwukierunkową muszę stworzyć funkcję pop_front która usuwa element z końca listy.
Kochana ukrainka dała taki oto kod, mógłby mi ktoś pomóc jak zacząć pisać tę funkcję, ogarnąłem zasadę działania listy dwukierunkowej ale potrzebuje wskazówek napisania funkcji pop_front() w szablonowej liscie dwukierunkowej.


using namespace std;

//lista dwukierunkowa

template< typename T >

class List

{

protected:

	//klasa zagnieżdżona: węzeł 

	class Item

	{

		T value;

		Item *n, *p;

	public:

		Item(const T &v) : n(NULL), p(NULL), value(v) {}

		~Item() {}

		Item* next(void) const { return n; }

		Item* prev(void) const { return p; }

		void next(Item* v) { n = v; }

		void prev(Item* v) { p = v; }

		T& get(void) { return value; }

	};

public:

	//klasa zagnieżdżona: iterator 

	class Iterator

	{

		Item *pos;

		friend class List;

	public:

		Iterator(Item *p = NULL) : pos(p) {} //inicjalizacja wskaźnikiem

		Iterator(const Iterator &it) : pos(it.pos) {} //konstruktor kopiujący

		~Iterator() {}

		Item* get_pos() { return pos; }

		void set_pos(Item *it) { pos = it; }

		bool operator == (const Iterator &it) const

		{

			return pos == it.pos;

		}

		bool operator != (const Iterator &it) const

		{

			return pos != it.pos;

		}

		Iterator operator++()

		{

			if (!pos) throw "Invalid iterator";

			pos = pos->next();

			return Iterator(pos);

		}

		Iterator operator++(int)

		{

			if (!pos) throw "Invalid iterator";

			Iterator it(pos);

			pos = pos->next();

			return it;

		}

		Iterator operator--()

		{

			if (!pos) throw "Invalid iterator";

			pos = pos->prev();

			return Iterator(pos);

		}

		Iterator operator--(int)

		{

			if (!pos) throw "Invalid iterator";

			Iterator it(pos);

			pos = pos->prev();

			return it;

		}

		T& operator*() const

		{

			if (!pos) throw "Invalid iterator";

			return pos->get();

		}

	};

protected:

	Item *head, *tail; //specjalne węzły: głowa i ogon

public:

	List() : head(NULL), tail(NULL) {}//domyślny konstruktor

	List(const List &v)  //konstruktor kopiujący

	{

		for (Item *it = v.head; it; it = it->next())

			push_back(it->get());

	}

	List(Iterator first, Iterator last) : head(NULL), tail(NULL)

	{

		for (Iterator it = first; it != last; ++it) {

			push_back(*it);

		}

	}

	~List()

	{

		clear();

	}

	void clear(void)

	{

		while (head)

		{

			Item *it = head;

			head = head->next();

			delete it;

		}

		head = tail = NULL;

	}


	void pop_front()
	{



	}

	void push_back(const T& v)
	{
		Item *n = new Item(v);
		if (head == NULL)
		{
			head = tail = n;
		}
		else
		{
			tail->next(n);

			n->prev(tail);

			tail = n;
		}

	}

	Iterator begin() const

	{

		Iterator it(head);

		return it;

	}

	Iterator end(void) const

	{

		return Iterator(tail->next());

	}

	Iterator back(void) const

	{

		return Iterator(tail);

	}

	friend ostream& operator << (ostream& s, const List<T> &l)

	{

		for (Item *it = l.head; it; it = it->next())

			std::cout << " " << it->get();

		s << endl;

		return s;

	}

};



template <class T = int >

class Pair

{

	T x, y;

public:

	Pair(T x = 0, T y = 0) :x(x), y(y) {};

	friend ostream& operator << (ostream& s, const Pair<T> &p)

	{

		s << " (" << p.x << ":" << p.y << ") ";

		return s;

	}



};

int main() {

	List <Pair<double>>L00;

	for (unsigned i = 0; i < 5; i++)

		L00.push_back(Pair<double>(i/10.0, i/100.0));

	cout << L00;

	List<int> L1;

	for (unsigned i = 0; i < 15; i++)

		L1.push_back(i);

	cout << L1;

	List<int>::Iterator b = L1.begin(), e = L1.end();

	List<int> L2(b, e);

	cout << L2;

}

0

Zacznij od narysowania sobie listy dwukierunkowej i zwizualizuj co się dzieje z powiązaniami elementów (ze wskaźnikami) przy operacjach które wykonujesz (np. pop_front)

1 użytkowników online, w tym zalogowanych: 0, gości: 1