Помогите с темплайтом Vector и итератором.
От: na1s  
Дата: 23.04.07 12:36
Оценка:
Как написать?
Сам смог только это:
template <class T>
class Vector
{
T* data;
int size;
public:
    Vector(int);
    ~Vector()    { delete[] data; }
    T& operator [](int i) { return data[i];}
    Iterat Iter;
};
template <class T>
Vector <T>::Vector(int n)
{
data = new T[n];
size=n;
}

как описать итератор?

Здесь и ниже по всей ветке добавлена разметка и вырезан оверквотинг. — Кодт
Re: Помогите с темплайтом Vector и итератором.
От: NikeByNike Россия  
Дата: 23.04.07 13:41
Оценка:
Здравствуйте, na1s, Вы писали:

Я учился — читая STL, пытался понять — зачем сделано так, а не иначе. И соответственно по каждому вопросу лез в учебник.
Нужно разобрать угил.
Re[2]: Помогите с темплайтом Vector и итератором.
От: na1s  
Дата: 23.04.07 14:05
Оценка:
Здравствуйте, NikeByNike, Вы писали:

NBN>Здравствуйте, na1s, Вы писали:


NBN>Я учился — читая STL, пытался понять — зачем сделано так, а не иначе. И соответственно по каждому вопросу лез в учебник.

Я просто не смог понять, как описать итератор. В учебнике много нет. А понять STL полностью, я пока не в силах.
Re[3]: Помогите с темплайтом Vector и итератором.
От: NikeByNike Россия  
Дата: 23.04.07 14:11
Оценка:
Здравствуйте, na1s, Вы писали:

N>Здравствуйте, NikeByNike, Вы писали:


NBN>>Здравствуйте, na1s, Вы писали:


NBN>>Я учился — читая STL, пытался понять — зачем сделано так, а не иначе. И соответственно по каждому вопросу лез в учебник.

N>Я просто не смог понять, как описать итератор. В учебнике много нет. А понять STL полностью, я пока не в силах.

В твоем случае итератором является указатель на T.

Он имеет:
1. операторы ++ и --
2. оператор -> и *

в твоём случае:
const T* begin() const { return data; }
const T* end() const { return data + size; }
T* begin() { return data; }
T* end() { return data + size; }


Кроме того:
ты забыл сделать конструктор копирования и оператор копирования.

Кроме того:
Vector(int) лучше записать, как: explicit Vector(int)

P.S.
Настоятельно рекомендую сначала почитать Страуструпа, Мейерса, Саттера, Александреску и иже с ними.
Нужно разобрать угил.
Re[4]: Помогите с темплайтом Vector и итератором.
От: na1s  
Дата: 23.04.07 14:18
Оценка:
Здравствуйте, NikeByNike, Вы писали:

NBN>Настоятельно рекомендую сначала почитать Страуструпа, Мейерса, Саттера, Александреску и иже с ними.

Я просто не смог понять, как описать итератор????
Т.е в структура класса vector и как туда присобачить iterator???
Re: Помогите с темплайтом Vector и итератором.
От: na1s  
Дата: 23.04.07 14:36
Оценка:
Здравствуйте, na1s, Вы писали:

N>как описать итератор?

Как описать итератор?
Re[2]: Помогите с темплайтом Vector и итератором.
От: NikeByNike Россия  
Дата: 23.04.07 14:46
Оценка:
Здравствуйте, na1s, Вы писали:

N>Как описать итератор?


Загляни в стандартный vector и ты всё увидишь!
template <class T>
class Vector
{
public:
struct iterator
{
void operator++();
bool operator==() const;
bool operator!=() const;
}

}
Нужно разобрать угил.
Re[3]: Помогите с темплайтом Vector и итератором.
От: na1s  
Дата: 23.04.07 14:59
Оценка:
Здравствуйте, NikeByNike, Вы писали:

NBN>Загляни в стандартный vector и ты всё увидишь!

<>

Спасибо!!!
Re[3]: Помогите с темплайтом Vector и итератором.
От: na1s  
Дата: 23.04.07 15:25
Оценка:
Блин, сдаюсь.
Что надо чтобы эта фигня работала с помощью самодельного вектора.
#include <fstream>
#include <iostream>
#include "vect.h"
#include <algorithm>
#include <numeric>
#include <conio.h>

using namespace std;

int main(int argc,char * argv[])
{
    ifstream inFile;
    Vector<int> vect(100);
    inFile.open("input.txt");
    for(Vector<int>::iterator  i=vect.begin();i<vect.end();i++)
    {
        //inFile>>*i;
    }
    //.cout << accumulate(min_element(vect.begin(),vect.end()),max_element(vect.begin(),vect.end()),0)<<"\n";
    getch();
    
}
Re[4]: Помогите с темплайтом Vector и итератором.
От: NikeByNike Россия  
Дата: 23.04.07 15:31
Оценка:
Здравствуйте, na1s, Вы писали:

N>int main(int argc,char * argv[])
N>{
N>    ifstream inFile;
N>    Vector<int> vect(100);
N>    inFile.open("input.txt");
N>    for(Vector<int>::iterator  i=vect.begin();i<vect.end();i++)
N>    {
N>        //inFile>>*i;
N>    }
N>    //.cout << accumulate(min_element(vect.begin(),vect.end()),max_element(vect.begin(),vect.end()),0)<<"\n";
N>    getch();
    
N>}

struct iterator
{
  T& operator*()
  {
    return *p;
  }

  T* operator->()
  {
    return p;
  }
  const T& operator*() const
  {
    return *p;
  }

  const T* operator->() const
  {
    return p;
  }
}
Нужно разобрать угил.
Re: Помогите с темплайтом Vector и итератором.
От: Кодт Россия  
Дата: 23.04.07 16:45
Оценка:
Здравствуйте, na1s, Вы писали:

N>как описать итератор?


Итак.
Итератор — это обобщение указателя на элемент массива. То есть объект, у которого есть те же характеристики, что и у указателя:
class your_iterator : std::iterator< your_iterator_tag, your_value_type >
{
public:
  your_iterator(); // можно сконструировать без параметров. будет указывать в никуда (аналог NULL)
  your_iterator(const your_iterator& src); // можно копировать
    // (не обязательно писать этот конструктор руками - компилятор сам умеет их делать)
  your_iterator& operator=(const your_iterator& src); // можно переприсваивать
    // та же ремарка

  // будучи указателем...
  your_value_type& operator*() const;  // разыменовав итератор, получаем ссылку на элемент
  your_value_type* operator->() const; // другая форма разыменования, ведущая к членам элемента

  // будучи указателем на элементы коллекции: над ним определена адресная арифметика
  bool operator==(const your_iterator& rhs) const; // можно сравнивать
  bool operator!=(const your_iterator& rhs) const;

  // ...для последовательного перебора - все итераторы
  your_iterator& operator++();
  your_iterator operator++(int) // пост-инкремент
    { your_iterator tmp(*this); ++*this; return tmp; }

  // ...в обратную сторону (если контейнер это позволяет) - Bidirectional Iterator
  your_iterator& operator--();
  your_iterator operator--(int)
    { your_iterator tmp(*this); --*this; return tmp; }

  // ...на произвольное смещение - Random Access Iterator
  your_iterator& operator+=(ptrdiff_t delta);
  your_iterator& operator-=(ptrdiff_t delta);
};

Наследование от std::iterator делает твой класс пригодным для работы с std::iterator_traits. Дело в том, что
— в ряде случаев нужно из типа итератора получить тип элемента
— некоторые алгоритмы по-разному реализуются для последовательных и произвольных итераторов
your_iterator_tag — это один из тэгов std:: input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag, random_access_iterator_tag.
У вектора, естественно, итератор может быть произвольного доступа. Но там нужно слишком много операций над ним реализовывать.



Но, как тебе уже сказали, итератором вектора прекрасно работает обычный голый указатель. Все операции над ним определены прямо в языке.
Описываешь
template<class T>
class Vector
{
  T* data_;
  int size_;
  .....
public:
  typedef T* iterator;
  typedef const T* const_iterator;
  
  iterator begin() { return data_; }
  iterator end() { return data_ + size_; }
  // и то же самое для const
};

Этого — достаточно.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.