The list class [code lang="c++"] #ifndef CP_LIST_INCLUDED #define CP_LIST_INCLUDED
#include
namespace CP {
template
node() :
data( T() ), prev( this ), next( this ) { }
node(const T& data,node* prev, node* next) :
data ( T(data) ), prev( prev ), next( next ) { }
};
class list_iterator {
friend class list;
protected:
node* ptr;
public:
list_iterator() : ptr( NULL ) { }
list_iterator(node *a) : ptr(a) { }
list_iterator& operator++() {
ptr = ptr->next;
return (*this);
}
list_iterator& operator--() {
ptr = ptr->prev;
return (*this);
}
list_iterator operator++(int) {
list_iterator tmp(*this);
operator++();
return tmp;
}
list_iterator operator--(int) {
list_iterator tmp(*this);
operator--();
return tmp;
}
T& operator*() { return ptr->data; }
T* operator->() { return &(ptr->data); }
bool operator==(const list_iterator& other) { return other.ptr == ptr; }
bool operator!=(const list_iterator& other) { return other.ptr != ptr; }
};
public: typedef list_iterator iterator;
protected: node *mHeader; // pointer to a header node size_t mSize;
public: //-------------- constructor & copy operator ----------
// copy constructor
list(list<T>& a) :
mHeader( new node() ), mSize( 0 ) {
for (iterator it = a.begin();it != a.end();it++) {
push_back(*it);
}
}
// default constructor
list() :
mHeader( new node() ), mSize( 0 ) { }
// copy assignment operator using copy-and-swap idiom
list<T>& operator=(list<T> other) {
// other is copy-constructed which will be destruct at the end of this scope
// we swap the content of this class to the other class and let it be descructed
using std::swap;
swap(this->mHeader, other.mHeader);
swap(this->mSize, other.mSize);
return *this;
}
~list() {
clear();
delete mHeader;
}
//------------- capacity function -------------------
bool empty() const {
return mSize == 0;
}
size_t size() const {
return mSize;
}
//----------------- iterator ---------------
iterator begin() {
return iterator(mHeader->next);
}
iterator end() {
return iterator(mHeader);
}
//----------------- access -----------------
T& front() { return mHeader->next->data; }
T& back() { return mHeader->prev->data; }
//----------------- modifier -------------
void push_back(const T& element) {
insert(end(),element);
}
void push_front(const T& element) {
insert(begin(),element);
}
void pop_back() {
erase(iterator(mHeader->prev));
}
void pop_front() {
erase(begin());
}
iterator insert(iterator it,const T& element) {
node *n = new node(element,it.ptr->prev, it.ptr);
it.ptr->prev->next = n;
it.ptr->prev = n;
mSize++;
return iterator(n);
}
iterator erase(iterator it) {
iterator tmp(it.ptr->next);
it.ptr->prev->next = it.ptr->next;
it.ptr->next->prev = it.ptr->prev;
delete it.ptr;
mSize--;
return tmp;
}
void clear() {
while (mSize > 0) erase(begin());
}
void print() {
std::cout << " Header address = " << (mHeader) << std::endl;
int i;
iterator before;
for (iterator it = begin();it!=end();before = it, it++,i++) {
std::cout << "Node " << i << ": " << *it;
std::cout << " (prev = " << it.ptr->prev << ", I'm at " << it.ptr << ", next = " << it.ptr->next << ")" << std:: endl;
}
}
};
}
#endif [/code]
The testing program
[code lang="c++"]
#include
bool test1() {
CP::list
CP::list
a.clear(); assert(a.size() == 0); a.push_front(1); a.push_front(2); a.push_front(3); a.push_front(4); a.push_front(5); a.pop_front(); a.pop_back(); a.print();
assert(a.front() == 4); assert(a.back() == 2);
return true; }
bool test2() { CP::liststd::string l,l2; l.push_back("AAA1"); l.push_back("AAA2"); l.push_back("AAA3"); l.push_front("BBB"); l2 = l; CP::liststd::string::iterator it1,it2; it1 = l.begin(); it2 = l2.begin(); for (;it1 != l.end();it1++,it2++) { assert(*it1 == *it2); } l2.print(); return true; }
bool test3() { CP::list<std::pairstd::string,int > l,l2; l.push_back(std::make_pair("A",1)); l.push_back(std::make_pair("B",2)); l.push_back(std::make_pair("C",3)); l.push_back(std::make_pair("D",4));
auto it = l.begin(); it--;it--;
for (size_t i = 0;i < l.size();i++) { l2.push_front(*it); it--; } for (auto& x: l2) { std::cout << x.first << ":" << x.second << std::endl; }
return true; }
int main() { if (test1()) std::cout << " ------------------------ TEST1 OK -------------------------" << std::endl; if (test2()) std::cout << " ------------------------ TEST2 OK -------------------------" << std::endl; if (test3()) std::cout << " ------------------------ TEST3 OK -------------------------" << std::endl; } [/code]
- Log in to post comments