Какой выбрать контейнер?
От: Аноним  
Дата: 29.03.07 06:21
Оценка:
Подскажите какой лучше выбрать контейнер (желательно stl), чтобы можно было сделать следущее:
1. Размер контейнера должен быть постоянный, т.е. я при инициализации указал — максимум 100 элементов, так вот если я делаю insert() 100ого элемента то, 0 элемент (т.е. самый первый) — удалялся
2. Данные в этом контейнере должны хранится следующим образом, если записываю этот контейнер в файл, то первым идет первый добавленный мною элемент, затем второй и т.д... (наверно это называется модель FIFO)
Re: Какой выбрать контейнер?
От: sc Россия  
Дата: 29.03.07 06:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите какой лучше выбрать контейнер (желательно stl), чтобы можно было сделать следущее:

А>1. Размер контейнера должен быть постоянный, т.е. я при инициализации указал — максимум 100 элементов, так вот если я делаю insert() 100ого элемента то, 0 элемент (т.е. самый первый) — удалялся
А>2. Данные в этом контейнере должны хранится следующим образом, если записываю этот контейнер в файл, то первым идет первый добавленный мною элемент, затем второй и т.д... (наверно это называется модель FIFO)

deque и доработать напильником
Re: Какой выбрать контейнер?
От: last_hardcoder  
Дата: 29.03.07 07:04
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Подскажите какой лучше выбрать контейнер (желательно stl), чтобы можно было сделать следущее:

А>1. Размер контейнера должен быть постоянный, т.е. я при инициализации указал — максимум 100 элементов, так вот если я делаю insert() 100ого элемента то, 0 элемент (т.е. самый первый) — удалялся
А>2. Данные в этом контейнере должны хранится следующим образом, если записываю этот контейнер в файл, то первым идет первый добавленный мною элемент, затем второй и т.д... (наверно это называется модель FIFO)


template<class T, int count> class CircleBuf{
  T data[count];
  int pos;
public:
  CircleBuf() : pos(0);

  T &operator[]( int idx ){
    return data[(pos + idx) % count];
  }

  void push_back( const T &val ){
    data[pos] = val;
    pos = (pos + 1) % count;
  }

  ...
};
Re[2]: Какой выбрать контейнер?
От: Bell Россия  
Дата: 29.03.07 07:05
Оценка:
Здравствуйте, sc, Вы писали:

sc>deque и доработать напильником


Можно начать с queue — может несколько уменьшить время на напильник
Любите книгу — источник знаний (с) М.Горький
Re[2]: Какой выбрать контейнер?
От: Аноним  
Дата: 29.03.07 07:06
Оценка:
Здравствуйте, sc, Вы писали:
sc>deque и доработать напильником

Я как понимаю надо будет перегрузить метод push_back() и делать там проверку на заданное кол-во элементов. Может кто-нибудь помочь примерчиком, а то я в stl полный профан.
Re[2]: Какой выбрать контейнер?
От: Аноним  
Дата: 30.03.07 11:43
Оценка:
Здравствуйте, last_hardcoder, Вы писали:

_>

_>template<class T, int count> class CircleBuf{
_>  T data[count];
_>  int pos;
_>public:
_>  CircleBuf() : pos(0);

_>  T &operator[]( int idx ){
_>    return data[(pos + idx) % count];
_>  }

_>  void push_back( const T &val ){
_>    data[pos] = val;
_>    pos = (pos + 1) % count;
_>  }

_>  ...
_>};

_>


Спасибо большое. Только я что-то не соображу как в этом класе сделать так чтобы count сохранялся в какую-нить переменную, внутри класса, и потом его можно было от туда достать. И можно ли как-нибудь массив T data[count] брать целиком, а не в цикле перебирать, это надо чтобы побыстрее записать его в файл?
Re[3]: Какой выбрать контейнер?
От: Аноним  
Дата: 30.03.07 12:35
Оценка:
Здравствуйте, Аноним, Вы писали:

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


_>>

_>>template<class T, int count> class CircleBuf{
_>>  T data[count];
_>>  int pos;
_>>public:
_>>  CircleBuf() : pos(0);

_>>  T &operator[]( int idx ){
_>>    return data[(pos + idx) % count];
_>>  }

_>>  void push_back( const T &val ){
_>>    data[pos] = val;
_>>    pos = (pos + 1) % count;
_>>  }

_>>  ...
_>>};

_>>


А>Спасибо большое. Только я что-то не соображу как в этом класе сделать так чтобы count сохранялся в какую-нить переменную, внутри класса, и потом его можно было от туда достать.



template<class T, int count> class CircleBuf{
public:
  static const int size = count;
  ...
};


А>И можно ли как-нибудь массив T data[count] брать целиком, а не в цикле перебирать, это надо чтобы побыстрее записать его в файл?


Целиком нельзя. Можно двумя кусками.
Re[4]: Какой выбрать контейнер?
От: Аноним  
Дата: 30.03.07 19:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


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


_>>>

_>>>template<class T, int count> class CircleBuf{
_>>>  T data[count];
_>>>  int pos;
_>>>public:
_>>>  CircleBuf() : pos(0);

_>>>  T &operator[]( int idx ){
_>>>    return data[(pos + idx) % count];
_>>>  }

_>>>  void push_back( const T &val ){
_>>>    data[pos] = val;
_>>>    pos = (pos + 1) % count;
_>>>  }

_>>>  ...
_>>>};

_>>>


А>>Спасибо большое. Только я что-то не соображу как в этом класе сделать так чтобы count сохранялся в какую-нить переменную, внутри класса, и потом его можно было от туда достать.


А>

А>template<class T, int count> class CircleBuf{
А>public:
А>  static const int size = count;
А>  ...
А>};

А>


А>>И можно ли как-нибудь массив T data[count] брать целиком, а не в цикле перебирать, это надо чтобы побыстрее записать его в файл?


А>Целиком нельзя. Можно двумя кусками.


А как, подскажите пожалуйста?
Re[5]: Какой выбрать контейнер?
От: Аноним  
Дата: 02.04.07 05:38
Оценка:
А>>

А>>template<class T, int count> class CircleBuf{
А>>public:
А>>  static const int size = count;
А>>  ...
А>>};

А>>

Вот так не компилится:
template<class T, int count> class CircleBuf
{
    T data[count];
    int pos;

public:

    static const int size = count;
    
    CircleBuf() : pos(0);
    
    T &operator[]( int idx )
    {
        return data[(pos + idx) % count];
    }
    
    void push_back( const T &val )
    {
        data[pos] = val;
        pos = (pos + 1) % count;
    }
};

main.cpp(14) : error C2258: illegal pure syntax, must be '= 0'
main.cpp(28) : see reference to class template instantiation 'CircleBuf<T,count>' being compiled
main.cpp(14) : error C2252: 'size' : pure specifier can only be specified for functions
main.cpp(28) : see reference to class template instantiation 'CircleBuf<T,count>' being compiled

PS. И ещё такой вопрос: я пока не проверял, как работает этот контейнер, но мне надо следующее: Допустим я делаю так:
CircleBuf<byte, 4> buffer;
buffer.push_back(1);
buffer.push_back(2);
buffer.push_back(3);
buffer.push_back(4);
// Теперь в буфере следующеее 1,2,3,4
buffer.push_back(5);
buffer.push_back(6);
// Теперь в буфере должно быть следующее 3,4,5,6

Так работает этот класс?
Re[6]: Какой выбрать контейнер?
От: alzt  
Дата: 03.05.07 10:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот так не компилится:


Так хотя бы конструктор правильно определите.

А>PS. И ещё такой вопрос: я пока не проверял, как работает этот контейнер, но мне надо следующее: Допустим я делаю так:

Так проверьте.

А>
А>CircleBuf<byte, 4> buffer;
А>buffer.push_back(1);
А>buffer.push_back(2);
А>buffer.push_back(3);
А>buffer.push_back(4);
А>// Теперь в буфере следующеее 1,2,3,4
А>buffer.push_back(5);
А>buffer.push_back(6);
А>// Теперь в буфере должно быть следующее 3,4,5,6
А>

А>Так работает этот класс?

Вообще, что-то похожее.
Re: Какой выбрать контейнер?
От: ncode  
Дата: 03.05.07 12:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите какой лучше выбрать контейнер (желательно stl), чтобы можно было сделать следущее:

А>1. Размер контейнера должен быть постоянный, т.е. я при инициализации указал — максимум 100 элементов, так вот если я делаю insert() 100ого элемента то, 0 элемент (т.е. самый первый) — удалялся
А>2. Данные в этом контейнере должны хранится следующим образом, если записываю этот контейнер в файл, то первым идет первый добавленный мною элемент, затем второй и т.д... (наверно это называется модель FIFO)
Очень похоже на кольцевой буффер.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.