Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача на класс массив, конструкторы, доступ к элементу и другое 
V
    Опции темы
1122
  Дата 20.9.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



Подскажите пожалуйста. Как реазиловать класс "массив", куда нужно впихнуть:
1. все возможные конструкторы (все виды), 
2. деструктор, 
3. автоматическое выделение памяти и автоматическое расширение границ массива, 
4. итератор (прямой и обратный)?

Может кто-то делал похожие задачи или может подсказать... заранее примного благодарен.

Добавлено через 3 минуты и 54 секунды
Забыл сказать, что STL пользовать нельзя :(
PM MAIL   Вверх
1122
Дата 20.9.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



Вот что имею, вопрос по итераторам по прежнему актуален:

Код

#include "stdafx.h"
#include <iostream.h>
template<class T>class Array
{
  int n;  //Количество элементов массива
  T* a; 
public:
  Array()  
  {
    n=5;    
    a=new T[n];
    for(int i=0; i<n; i++)
      a[i]=0;
  }
  Array(int n1)
  {
    n=index;
    a=new T[n];
    for(int i=0; i<n; i++)
      a[i]=0;
  }
  Array(const Array& mas)
  {
    n=mas.n;
    a=new T[n];
    for(int i=0; i<n; i++)
      a[i]=mas.a[i];
  }
  ~Array()
  {
    delete[] a;  
  }
  Array& operator=(const Array& mas)
  {
    if (this!=&mas)
    {
      delete[] a;
      n=mas.n;
      a=new T[n];
      for(int i=0; i<n; i++)
        a[i]=mas.a[i];
    }
    return *this;
  }
  //Возвращаем значение элемента массива по заданному индексу
  T& operator[](int index){return a[index];}
  //Возвращаем количество элементов массива
  int length(){return n;}
  //Увеличиваем размер массива на значение col
  void resize(unsigned int col)
  {
    T* tmp = new T[n+col];
    for(int i=0; i<n; i++)
      tmp[i]=a[i];
    delete[] a;
    n+=col;
    a=tmp;
  }
};

PM MAIL   Вверх
J0ker
Дата 20.9.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



упс, был неправ  smile 

Это сообщение отредактировал(а) J0ker - 20.9.2008, 19:49


--------------------
user posted image
PM MAIL   Вверх
J0ker
Дата 20.9.2008, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



добавьте
Код

const T& operator[](int index) const

иначе константный массив не будет работать

Добавлено @ 20:27
итератор должен содержать указатель на Array и текущий индекс (впринципе можно обойтись одним указателем, но тогда реаллокация массива будет приводить к инвалидизации итераторов)
должен реализовывать инкременты и если нужно декременты и адресную арифметику
должен имет операторы дереференс (*) и оператор доступа через указатель (->)
должен иметь оператор == и !=
ну и консрукторы/присвоения

Array можт реализовывать методы возвращающие итераторы

Это сообщение отредактировал(а) J0ker - 20.9.2008, 20:33


--------------------
user posted image
PM MAIL   Вверх
1122
Дата 20.9.2008, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



J0ker, огромное спасибо.
Было бы замечтально, если приведете пример (например, прямой итератор).

P.s. К сожалению, раньше никогда с ними не сталкивался... даже синтаксиса не знаю.
PM MAIL   Вверх
J0ker
Дата 20.9.2008, 21:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



протейший итератор:
Код

template <class T>
class ArrayIterator
{
private:
    T *ptr;
public:
    ArrayIterator(): ptr(NULL) {}
    ArrayIterator(T *p): ptr(p) {}
    ArrayIterator(Array<T> &array): ptr(&array[0]) {}
    ArrayIterator &operator=(const ArrayIterator &iterator) {
        ptr = iterator.ptr;
        return *this;
    }
    ArrayIterator(const ArrayIterator &iterator) { *this = iterator; }

    bool operator==(const ArrayIterator &iterator) { return ptr == iterator.ptr; }
    bool operator!=(const ArrayIterator &iterator) { return !operator==(iterator); }

    ArrayIterator &operator++() {
        ++ptr;
        return *this;
    }
    ArrayIterator operator++(int) {
        T *p = ptr++;
        return ArrayIterator(p);
    }
    
    T &operator*() { return *ptr; }
    T *operator->() { return ptr; }
}


PS могут быть ошибки - писал прямо тут
PPS по идее должно работать с ЛЮБЫМ - даже нэйтив - массивом

упс, немного поправил  smile 

Это сообщение отредактировал(а) J0ker - 20.9.2008, 21:36


--------------------
user posted image
PM MAIL   Вверх
J0ker
Дата 20.9.2008, 21:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



в Array надо добавить методы:
Код

ArrayIterator begin() { return ArrayIterator<T>(*this); }
ArrayIterator end() { return ArrayIterator<T>(&a[n]; } \\ СЛЕДУЮЩИЙ элемент за последним - см.ниже


по стандарту begin и end указывают на интервал как [begin, end) - т.е. end ужележит ЗА границами массива
Итерация по массиву
Код

for(ArrayIterator i = array.begin(); i != array.end(); ++i)
{
    std::cout << *i << std::endl;
}


Добавлено через 6 минут и 16 секунд
чтобы было красиво - 
Код

ArrayIterator(Array<T> &array): ptr(&array[0]) {}

можно убрать, а
Код

ArrayIterator begin() { return ArrayIterator<T>(*this); }

заменить на
Код

ArrayIterator begin() { return ArrayIterator<T>(&a[0]); }

Тогда итератор вообще никак не связан с типом массива, кроме как по типу элементов




--------------------
user posted image
PM MAIL   Вверх
1122
Дата 21.9.2008, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



Возник глупый вопрос. А как пользовать итератор непосредственно в мэйне?

Вот код моего мейна для тестирования класса Array

Код

int main(int argc, char* argv[])
{

  Array<int> m;
  m[0]=5;
  Array<double> m1;
  m1[0]=2.7+3.3;
  m1[1]=1.5+m1[0]*2;
  m1[3]=m1[0]+m1[1];
  cout<<m[0]<<endl;
  cout<<m1[0]<<endl;
  cout<<m1[1]<<endl;
  cout<<m1[3]<<endl;
  cout<<m1.length()<<endl;
  m1.resize(2);
  cout<<m1.length()<<endl;
  getch();
  return 0;
}


Это сообщение отредактировал(а) 1122 - 21.9.2008, 19:47
PM MAIL   Вверх
J0ker
Дата 22.9.2008, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14





--------------------
user posted image
PM MAIL   Вверх
1122
Дата 28.9.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



Цитата(J0ker @ 20.9.2008,  21:23)
протейший итератор:
Код

template <class T>
class ArrayIterator
{
private:
    T *ptr;
public:
    ArrayIterator(): ptr(NULL) {}
    ArrayIterator(T *p): ptr(p) {}
    ArrayIterator(Array<T> &array): ptr(&array[0]) {}
    ArrayIterator &operator=(const ArrayIterator &iterator) {
        ptr = iterator.ptr;
        return *this;
    }
    ArrayIterator(const ArrayIterator &iterator) { *this = iterator; }

    bool operator==(const ArrayIterator &iterator) { return ptr == iterator.ptr; }
    bool operator!=(const ArrayIterator &iterator) { return !operator==(iterator); }

    ArrayIterator &operator++() {
        ++ptr;
        return *this;
    }
    ArrayIterator operator++(int) {
        T *p = ptr++;
        return ArrayIterator(p);
    }
    
    T &operator*() { return *ptr; }
    T *operator->() { return ptr; }
}


PS могут быть ошибки - писал прямо тут
PPS по идее должно работать с ЛЮБЫМ - даже нэйтив - массивом

упс, немного поправил  smile

Программу собрал. Работает (были мелкие синтаксические незначительные ошибки). Спасибо.
Был бы очень признателен, если бы дописали комментариев к каждой срочке, если, конечно, не сложно. Т.е. что есть что. Желательно доступным и понятным языком... как бы.. ээ.. для чайника.
Заранее спасибою

Код

template <class T>
class ArrayIterator
{
private:
    T *ptr;
public:
    ArrayIterator(): ptr(NULL) {}
    ArrayIterator(T *p): ptr(p) {}
    ArrayIterator(Array<T> &array): ptr(&array[0]) {}
    ArrayIterator &operator=(const ArrayIterator &iterator) {
        ptr = iterator.ptr;
        return *this;
    }
    ArrayIterator(const ArrayIterator &iterator) { *this = iterator; }

    bool operator==(const ArrayIterator &iterator) { return ptr == iterator.ptr; }
    bool operator!=(const ArrayIterator &iterator) { return !operator==(iterator); }

    ArrayIterator &operator++() {
        ++ptr;
        return *this;
    }
    ArrayIterator operator++(int) {
        T *p = ptr++;
        return ArrayIterator(p);
    }
    
    T &operator*() { return *ptr; }
    T *operator->() { return ptr; }
}


PM MAIL   Вверх
J0ker
Дата 29.9.2008, 04:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Код

template <class T>
class ArrayIterator
{
private:
    T *ptr;
public:
    ArrayIterator(): ptr(NULL) {} // default constructor
    ArrayIterator(T *p): ptr(p) {}  // constructor from pointer to type T
    ArrayIterator(Array<T> &array): ptr(&array[0]) {} // begin constructor from Array<T> (can be removed)
    ArrayIterator &operator=(const ArrayIterator &iterator) {  // assignment operator
        ptr = iterator.ptr;
        return *this;
    }
    ArrayIterator(const ArrayIterator &iterator) { *this = iterator; }  // copy-constructor (using assignment operator)
    bool operator==(const ArrayIterator &iterator) const { return ptr == iterator.ptr; }   // operator equal-to
    bool operator!=(const ArrayIterator &iterator) const { return !operator==(iterator); }   // operator not-equal-to (using equal-to operator)
    ArrayIterator &operator++() {   // prefix increment
        ++ptr;   // move pointer to next position
        return *this;   // return reference to self
    }
    ArrayIterator operator++(int) {   // postfix increment
        T *p = ptr++;   // save pointer, then increment pointer to next position
        return ArrayIterator(p);   // return previous iterator
    }
    
    T &operator*() const { return *ptr; }  // dereference operator (*)
    T *operator->() const { return ptr; }   // member by pointer access operator (->)
}


Это сообщение отредактировал(а) J0ker - 29.9.2008, 16:33


--------------------
user posted image
PM MAIL   Вверх
UnrealMan
Дата 29.9.2008, 11:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Разыменование итераторов должно осуществляться константными функциями.
Следовало бы ещё константный тип итераторов добавить, и соответствующие begin, end, cbegin, cend в контейнере.
PM MAIL   Вверх
J0ker
Дата 29.9.2008, 16:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(UnrealMan @  29.9.2008,  11:39 Найти цитируемый пост)
Разыменование итераторов должно осуществляться константными функциями.

так же как и операторы == и !=
согласен исправлено

Это сообщение отредактировал(а) J0ker - 29.9.2008, 16:34


--------------------
user posted image
PM MAIL   Вверх
J0ker
Дата 29.9.2008, 16:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(UnrealMan @  29.9.2008,  11:39 Найти цитируемый пост)
Следовало бы ещё константный тип итераторов добавить, и соответствующие begin, end, cbegin, cend в контейнере. 

вместо cbegin и cend достаточно перегрузить begin и end как const


--------------------
user posted image
PM MAIL   Вверх
1122
Дата 29.9.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: -1
Всего: нет



Спасибо.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.