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
No dobra ale co ma robic ten uogólniony algorytm odejmowania bitowego
?
Tak jest to opisane :(
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.
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;}
?
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
?
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;
}
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)