- . . List, . , . list.cpp . .., , .
, , . .
list.hpp
#ifndef _LIST_HPP_
#define _LIST_HPP_
/*****************************************************************************/
#include <initializer_list>
#include <utility>
#include <stdexcept>
/*****************************************************************************/
template < typename T >
class List
{
/*-----------------------------------------------------------------*/
private:
/*-----------------------------------------------------------------*/
//
class Node
{
/*-------------------------------------------------------------*/
public:
/*-------------------------------------------------------------*/
Node (const T & _value)
: m_value(_value)
, m_pNext(nullptr)
{}
const T & GetValue () const { return m_value; }
T & GetValue () { return m_value; }
Node const * GetNext () const { return m_pNext; }
Node * GetNext () { return m_pNext; }
void SetNext (Node * _pNext) { m_pNext = _pNext; }
void ClearNext () { m_pNext = nullptr; }
/*-------------------------------------------------------------*/
private:
/*-------------------------------------------------------------*/
//
T m_value;
Node * m_pNext;
/*-------------------------------------------------------------*/
};
/*-----------------------------------------------------------------*/
public:
/*-----------------------------------------------------------------*/
//
class Iterator
{
/*-------------------------------------------------------------*/
public:
/*-------------------------------------------------------------*/
explicit Iterator (Node * _pNode = nullptr);
const T & operator * () const;
T & operator * ();
bool operator == (Iterator i) const;
bool operator!= (Iterator i) const;
Iterator & operator ++ ();
Iterator operator ++ (int);
|
|
/*-------------------------------------------------------------*/
private:
/*-------------------------------------------------------------*/
friend class List;
void validate () const;
/*-------------------------------------------------------------*/
Node * m_pCurrent;
/*-------------------------------------------------------------*/
};
/*-----------------------------------------------------------------*/
//
List ();
//
template < typename U >
List (std::initializer_list< U > _l);
//
template < typename U >
List (const List< U > & _l);
//
List (List< T > && _l);
//
~List ();
//
template < typename U >
List< T > & operator = (const List< U > & _l);
//
List< T > & operator = (List< T > && _l);
/*-----------------------------------------------------------------*/
//
Iterator begin () const;
Iterator end () const;
/*-----------------------------------------------------------------*/
//
bool IsEmpty () const;
//
int Size () const;
//
void Clear ();
//
void PushBack (const T & _value);
//
void PushFront (const T & _value);
//
void PopBack ();
//
void PopFront ();
//
void InsertAfter (Iterator _prevPos, const T & _value);
//
void InsertBefore (Iterator _nextPos, const T & _value);
//
void Delete (Iterator _pos);
// ,
void DeleteBefore (Iterator _nextPos);
// ,
void DeleteAfter (Iterator _prevPos);
/*-----------------------------------------------------------------*/
private:
/*-----------------------------------------------------------------*/
//
void CopyDataFrom (const List< T > & _l);
//
bool Owns (Iterator _pos) const;
/*-----------------------------------------------------------------*/
//
Node * m_pFirst;
Node * m_pLast;
/*-----------------------------------------------------------------*/
};
/*****************************************************************************/
//... ...
|
|
/*****************************************************************************/
#endif // _LIST_HPP
. , , - , - , .
template < typename T >
void List< T >::Iterator::validate () const
{
if (!m_pCurrent)
throw std::logic_error("Invalid list iterator state");
}
-. , , . , :
template < typename T >
typename List< T >::Iterator & //
List< T >::Iterator::operator ++ ()
{
validate();
m_pCurrent = m_pCurrent->GetNext();
return * this;
}
. , 100% . , .
test_list.cpp
/*****************************************************************************/
#include "list.hpp"
#include <iostream>
#include <string>
/*****************************************************************************/
//
template class List< int >;
template class List< double >;
template class List< std::string >;
/*****************************************************************************/
//
template < typename T >
void printRange (const List< T > & _l)
{
std::cout << "List(" << _l.Size() << "): ";
for (const T & val: _l)
std::cout << val << ' ';
std::cout << std::endl;
}
/*****************************************************************************/
int main ()
{
// 3
List< int > l1{ 1, 2, 3, 4, 5 };
List< double > l2{ 1.0, 2.0, 3.0, 4.0 };
List< std::string > l3{ "A", "B", "C" };
// ,
printRange(l1);
printRange(l2);
printRange(l3);
}
/*****************************************************************************/
:
#include <cassert>
template < typename T >
const T * MyFind (const T * _pArray, int _nElements, const T & _value)
{
for (int i = 0; i < _nElements; i++)
if (_pArray[ i ] == _value)
return _pArray + i;
return nullptr;
}
int main ()
{
int data[ 5 ] = { 1, 2, 3, 4, 5 };
const int * pResult = MyFind(data, 5, 3);
assert(pResult && ((pResult - data) == 2));
}
. , , . , , . , . . , , .
|
|
- . . , :
template < typename T >
typename List< T >::Iterator //
MyFind (const List< T > & _list, const T & _value)
{
//
List< T >::Iterator it = _list.begin();
//
while (it!= _list.end())
{
// .
//
if (* it == _value)
// ,
return it;
//
++it;
}
return _list.end();
}
int main ()
{
List < int > myList{ 1, 2, 3, 4, 5 };
const List< int >::Iterator it = MyFind(myList, 3);
assert((it!= myList.end()) && (* it == 3));
}
, , . . .
-, , . , , . , , , .
template < typename T >
const T * MyFind (const T * _pArrayFirst,
const T * _pArrayLast,
const T & _value)
{
const T * pCurrent = _pArrayFirst;
while (pCurrent!= _pArrayLast)
{
if (* pCurrent == _value)
return pCurrent;
++ pCurrent;
}
return _pArrayLast;
}
:
int main ()
{
int data[ 5 ] = { 1, 2, 3, 4, 5 };
const int * pResult = MyFind(data, data + 5, 3);
assert(pResult && ((pResult - data) == 2));
}
, .
, . - , . (==,!=), (=), (++X), , (* x), . - .
template < typename It, typename T >
|
|
It MyFind (It _first, It _last, const T & _value)
{
It current = _first;
while (current!= _last)
{
if (* current == _value)
return current;
++ current;
}
return _last;
}
. , , . :
List< int > myList{ 1, 2, 3, 4, 5 };
const List< int >::Iterator it = MyFind(myList.begin(), myList.end(), 3);
assert((it!= myList.end()) && (*it == 3));
, , ( , , - ). , , .
(generic concept) - , - . , - . ++ , , . ++ , .
, . , :
std::istream_iterator< int > result =
MyFind(
std::istream_iterator< int >(std::cin),
std::istream_iterator< int >(),
);
assert(* result == 3);
:
template < typename T >
class istream_iterator
{
public:
istream_iterator (std::istream & _stream)
: m_pStream(& _stream), m_currentValue(T())
{
update();
}
istream_iterator ()
: m_pStream(nullptr)
{
}
bool operator == (const istream_iterator & _it) const
{
return m_pStream == _it.m_pStream;
}
bool operator!= (const istream_iterator & _it) const
{
return!(* this == _it);
}
istream_iterator& operator ++ ()
{
update();
return * this;
}