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