필자는 필자에게 테스트 메인 프로그램과 함께 작동하는 list 구현을 만들었습니다. 나는 목록의 모든 적절한 기능이 프로그램에서 구현되는 것은 아니며 나는 그 점에 대해 잘 알고 있습니다.리스트 함수 C++에서
여기에 내가 만든 코드 :
프로그램이 실행#include <iostream>
#include <algorithm>
using namespace std;
template <class T> class Link;
template <class T> class List_iterator;
template <class T>
class List
{
public:
typedef List_iterator<T> iterator;
List();
List(const List<T> & l);
~List();
bool empty() const;
unsigned int size() const;
T & back() const;
T & front() const;
void push_front(const T & x);
void push_back(const T & x);
void pop_front();
void pop_back();
iterator begin() const;
iterator end() const;
void insert(iterator pos, const T & x);
void erase(iterator & pos);
List<T> & operator=(const List<T> & l);
protected:
Link<T> * first_link;
Link<T> * last_link;
unsigned int my_size;
};
template <class T>
List<T>::List()
{
first_link = 0;
last_link = 0;
my_size = 0;
}
template <class T>
List<T>::List(const List & l)
{
first_link = 0;
last_link = 0;
my_size = 0;
for (Link<T> * current = l.first_link; current != 0; current = current -> next_link)
push_back(current -> value);
}
template <class T>
typename List<T>::iterator List<T>::begin() const
{
return iterator(first_link);
}
template <class T>
class Link
{
private:
Link(const T & x): value(x), next_link(0), prev_link(0) {}//pg. 204
T value;
Link<T> * next_link;
Link<T> * prev_link;
friend class List<T>;
friend class List_iterator<T>;
};
template <class T> class List_iterator//pg.207
{
public:
typedef List_iterator<T> iterator;
List_iterator(Link<T> * source_link): current_link(source_link) { }
List_iterator(): current_link(0) { }
List_iterator(List_iterator<T> * source_iterator): current_link(source_iterator.current_link) { }
T & operator*(); // dereferencing operator
iterator & operator=(const iterator & rhs);
bool operator==(const iterator & rhs) const;
bool operator!=(const iterator & rhs) const;
iterator & operator++();
iterator operator++(int);
iterator & operator--();
iterator operator--(int);
protected:
Link<T> * current_link;
friend class List<T>;
};
template <class T>
T & List_iterator<T>::operator*()
{
return current_link -> value;
}
template <class T>
List_iterator<T> & List_iterator<T>::operator++()
{
current_link = current_link -> next_link;
return *this;
}
template <class T>
void List<T>::push_back(const T & x)
{
Link<T> * new_link = new Link<T> (x);
if (first_link == 0)
first_link = last_link = new_link;
else
{
new_link->prev_link = last_link;
last_link->next_link = new_link;
last_link = new_link;
}
my_size++;
}
template <class T>
typename List<T>::iterator List<T>::end() const
{
return iterator(last_link);
}
template <class T>
List <T>::~List()
{
Link <T> * first = first_link;
while (first != 0)
{
Link <T> * next = first->next_link;
delete first;
first = next;
}
}
template<class T>
bool List_iterator<T>::operator==(const iterator & rhs) const
{
return (this->current_link == rhs.current_link);
}
template <class T>
bool List_iterator<T>::operator!=(const iterator & rhs) const
{
return !(*this == rhs);
}
int main()
{
List<int> l;
l.push_back(44); // list = 44
l.push_back(33); // list = 44, 33
l.push_back(11); // list = 44, 33, 11
l.push_back(22); // list = 44, 33, 11, 22
List<int> m(l);
List<int>::iterator itr(m.begin());
while (itr != m.end()) {
cout << *itr << endl;
++itr;
}
}
, 목록의 첫 번째 세 가지 요소가 터미널에 표시되는은과 그 이유를 나는 확신입니다. 누구든지 나를위한 이유를 지적 할 수 있습니까?
또한 연산자 []를 추가하려고하면 목록의 특정 요소가 표시됩니다. 어떻게 처리합니까? 예 :
cout << l[2]; // would display 33
제가 사용하는 교과서에는 예제가 없으므로 도움이 될 것입니다.
변수에 소문자 'L'을 사용하지 마십시오. 그것은 1 (1)과 매우 흡사합니다. 조금 혼란 스럽습니다. –
@ John Gordon - 네 말이 맞아. 나는 그걸 명심 할거야. – UndefinedReference
@Mikhailovich : 복사/이동 생성자와 할당 연산자에 대한 좋은 규칙은 변수를 'const List & other'로 명명하는 것입니다. :) –
Xeo