.


:




:

































 

 

 

 


:




 

- . . 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;

}

 





:


: 2017-01-21; !; : 462 |


:

:

, , . , .
==> ...

1788 - | 1641 -


© 2015-2024 lektsii.org - -

: 0.148 .