Форум «Всё о Паскале» _ Ада и другие языки _ Работа со строками
Автор: Neonig 13.12.2007 20:22
Прошу Вас изучить программу. Далее задание. Проблем собственно в том, что стоит создать файл тысячи на 2 - 3 сток, как программа перестает функционировать, но и это пол беды, основная заключается в том, что на примере 1000 строк время выполнение ужасно долгое...в остальном она функционирует, т.е. на маленьких файлах все отличняком, а вот на таких тестах обваливается - прошу помочь.... очень надо
Задание
Определите две реализации класса String. Требования: Первая реализация. Каждый экземпляр класса содержит свой динамический буфер для хранения данных Вторая реализация (использование механизма "copy on write"). Экземпляры классов, содержащие одинаковые данные (такие экземпляры можно получить, например, при операции присваивания либо через конструктор копирования), содержат ссылку на один и тот же буфер с данными. Основные операторы, которые должны быть реализованы в классе String:
#include <memory.h> #include <iostream> #include <exception> using namespace std; template <class mytype> class Container { private: mytype *m; int size; public: Container(); class Range {}; // класс исключений void cont_add(mytype data); // добавляет элемент в конец контейнера void cont_insert(mytype data, int pos); //вставляет элемент в позицию pos int cont_size() const; // размер контейнера mytype cont_get(int pos) const; //возвращает данные из позиции pos mytype cont_replace(mytype data, int pos); // заменяет данные в позиции pos. возвращает старые данные mytype cont_remove(int pos); // удаляет данные из позиции pos mytype operator[](int pos) const; // что-то типа итератора mytype & operator[](int pos); // что-то типа итератора
~Container() { delete []m; } }; template <class mytype> Container <mytype>:: Container() { size=0; } template <class mytype> void Container<mytype>:: cont_add(mytype data) // Добавляет элемент в конец контейнера { int i; mytype *n; n=m; m=new mytype[sizeof(mytype)*(size+1)]; if(n!=NULL) { for (i=0; i<size; i++) m[i]=n[i]; } m[size]=data; size++; // delete []n; } template <class mytype> void Container<mytype>:: cont_insert(mytype data, int pos){ // Вставляет злемент в позицию pos mytype *n=m; m=new mytype[sizeof(mytype)*(size+1)]; if(pos>size) { pos = size; } if(n!=NULL) { memcpy(m,n,sizeof(mytype)*pos); } m[pos]=data; if (n!=NULL) { memcpy(&(m[pos+1]),&(n[pos]),sizeof(mytype)*(size-pos)); } size++; delete []n; } template <class mytype> int Container<mytype>:: cont_size() const // Возвращает размер контейнера { return (size); } template <class mytype> mytype Container<mytype>:: cont_get(int pos) const // Возвращает данные в позиции pos { if (pos>=size) { throw Range(); } return (m[pos]); } template <class mytype> mytype Container<mytype>:: cont_replace(mytype data, int pos) // Заменяет данные в позиции pos. Возвращает старые данные. { if(pos>=size) { pos = size-1; } mytype d = m[pos]; m[pos] = data; return d; } template <class mytype> mytype Container<mytype>:: cont_remove(int pos) // Удаляет данные из позиции pos. Возвращает удаленные данные. { if(pos>=size) { throw Range(); } mytype *n=m; mytype p=m[pos]; if (size<=0) { throw Range(); } m=new mytype[sizeof(mytype)*(size-1)]; if (size>1) { memcpy(m,n,sizeof(mytype)*pos); memcpy(&(m[pos]),&(n[pos+1]),sizeof(mytype)*(size-pos-1)); } else{ m = NULL; }
Ты бы выложил программу в архиве что-ли, а то я собрать это не могу.. В частности по причине:
Цитата
copywrite.cpp:124: error: no matching function for call to `block::block(block)' copywrite.h:16: note: candidates are: block::block(block&) copywrite.cpp:6: note: block::block(const char*)
И компилятор укажи, заодно...
Автор: Neonig 14.12.2007 0:01
Вот адресок на архив с проектом....
Автор: volvo 14.12.2007 2:21
Neonig, объясни мне вот какую вещь: у тебя задание в чем заключается? Написать класс Strings, так? Зачем ты придумываешь что-то другое еще? Есть же std::vector, если его использовать вместо твоего класса Container, то программа летает как на 1000 строк, так и на 2000. Только тебе понадобится исправить
Strings(Strings &b) // на Strings(const Strings &b)
иначе vector не поймет тебя...
Автор: Neonig 14.12.2007 2:48
На производительность влияло именно это?
Автор: volvo 14.12.2007 3:10
На производительность влиял именно написанный тобой самокат (ибо по сравнению со стандартными STL-евскими контейнерами его даже велосипедом назвать трудно)...
При использовании вектора файл из 5000 строк обрабатывается в течении секунды...