С++ для начинающих



         

Порождение класса отсортированного массива


Вторая наша специализация класса Array– отсортированный подтип Array_Sort. Мы поместим его определение в заголовочный файл Array_S.h:

#ifndef ARRAY_S_H_

#define ARRAY_S_H_

#include "Array.h"

template <class Type>

class Array_Sort : public virtual Array<Type> {

protected:

    void set_bit()   { dirty_bit = true; }

    void clear_bit() { dirty_bit = false; }

    void check_bit() {

         if ( dirty_bit ) {

              sort( 0, Array<Type>::_size-1 );

              clear_bit();

         }

    }

public:

    Array_Sort( const Array_Sort& );

    Array_Sort( int sz = Array<Type>::ArraySize )

              : Array<Type>( sz )

                { clear_bit();  }

    Array_Sort( const Type* arr, int sz )

              : Array<Type>( arr, sz )

              { sort( 0,Array<Type>::_size-1 ); clear_bit(); }

    Type& operator[]( int ix )

                 { set_bit(); return ia[ ix ]; }

    void print( ostream& os = cout ) const

           { check_bit(); Array<Type>::print( os ); }

    Type min() { check_bit(); return ia[ 0 ]; }

    Type max() { check_bit(); return ia[ Array<Type>::_size-1 ]; }

    bool is_dirty() const { return dirty_bit; }

    int  find( Type );

    void grow();

protected:

    bool dirty_bit;

};

#endif

Array_Sort включает дополнительный член – dirty_bit. Если он установлен в true, то не гарантируется, что массив по-прежнему отсортирован. Предоставляется также ряд вспомогательных функций доступа: is_dirty() возвращает значение dirty_bit; set_bit() устанавливает dirty_bit в true; clear_bit() сбрасывает dirty_bit в false; check_bit() пересортировывает массив, если dirty_bit равно true, после чего сбрасывает его в false. Все операции, которые потенциально могут перевести массив в неотсортированное состояние, вызывают set_bit().

При каждом обращении к шаблону Array необходимо указывать полный список параметров.




Содержание  Назад  Вперед