
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.103.248] |
![]() |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
массив строк:
#define MAX_SIZE 20000 char *str[MAX_SIZE] недостаток - заранее нужно указывать максимальный размер |
Сообщ.
#17
,
|
|
|
Дядя Банзай, Ваш способ работы со строками хороший, быстрый.. до тех пор, пока нам не придётся сильно манипулировать с ними
![]() ![]() |
Сообщ.
#18
,
|
|
|
У меня вопрос к автору топика.
Не кажется ли Вам, что смешивание стилей в учебном материале (как я понял цель топика - просвещение), это плохой пример для новичков? Почему бы не использовать std::cout, если уж начали переход от С к С++? Аналогично при сортировке. Для класса определены operator>, operator< и метод compare. Использование c_str() в данном случае не просто не имеет смысла, но и приводит, как понимаю, лишний раз к выделению памяти, т.к. стандартом не оговаривается, что данные в std::sting должны быть расположены линейно, как в std::vector. Цитата dangee, 31.03.04, 08:50, 328276 А как std::string конвертировать в int, double, float и обратно? Можно использовать вот такие два шаблонных класса: ![]() ![]() template <typename T> std::string toString(T val) { std::ostringstream oss; oss<< val; return oss.str(); } template<typename T> T fromString(const std::string& s) { std::istringstream iss(s); T res; iss >> res; return res; } Пример использования: ![]() ![]() int iVal; std::string strInt = toString(iVal); iVal = fromString<int>(strInt); float fVal; std::string strFloat = toString(fVal); fVal = fromString<float>(strFloat); |
Сообщ.
#19
,
|
|
|
Внесу-ка я свою лепту
![]() ![]() ![]() #include <stdlib.h> #include <string.h> #include <stdio.h> #define ST_SUCCESS 0 #define ST_NO_MEM 0 #define ST_INDEX_MAX 64000 #define ST_INDEX_OVER 64001 class stringlist; struct string_s { string_s* next; string_s* prev; char* data; }; string_s* null_pointer = NULL; class stringlist { protected: string_s* first; //pointer to first entry string_s* end; //pointer to last entry public: stringlist(); ~stringlist(); string_s* operator [](unsigned int index); unsigned int find(const char* s); int add(string_s** pointer, const char* data); int create(const char* data, string_s** pointer_recurce); int append(char* data); string_s* delete_entry(string_s* pointer); int set(string_s* pointer, const char* data); char* get(string_s* pointer, char* s1); string_s* walk(unsigned int number); }; int stringlist::add(string_s** pointer1, const char* data) { int result = ST_SUCCESS; string_s *pointer = *pointer1; string_s *newitem = (string_s*) malloc(sizeof (string_s)); if(newitem!=NULL) { newitem->data = (char*) malloc(strlen(data)+1); if(newitem->data!=NULL) { strcpy(newitem->data, data); if(NULL != pointer) { newitem->next = pointer->next; pointer->next = newitem; } else { pointer=newitem; newitem->next=NULL; first=newitem; } newitem->prev=pointer; } else { free(newitem); result = ST_NO_MEM; } } else { result = ST_NO_MEM; } *pointer1 = pointer; return result; } int stringlist::create(const char* data, string_s** pointer_recurse=&null_pointer) { int result = ST_SUCCESS; string_s* pointer = *pointer_recurse; string_s* pointer_first = first; if(NULL == first) { //if first entry not created :) result = add(&pointer, data); if(result == ST_SUCCESS) { pointer->next = NULL; first = pointer; } } else { first=NULL; result = create(data, &pointer); if(result == ST_SUCCESS) { pointer->next = pointer_first; } } pointer->prev=NULL; *pointer_recurse = pointer; return result; } int stringlist::append(char* data) { return add(&end, data); } string_s* stringlist::delete_entry(string_s* pointer) { string_s* pointer_next = pointer->next; string_s* pointer_prev = pointer->prev; if(pointer!=NULL) { if(pointer==end) { end = pointer_prev; } if(pointer->data != NULL) { free(pointer->data); } free(pointer); } if(pointer_prev!=NULL) pointer_prev->next = pointer_next; return pointer_prev; } char* stringlist::get(string_s* pointer, char* s1) { if(pointer!=NULL) return strcpy(s1, pointer->data); else return NULL; } int stringlist::set(string_s* pointer, const char* data) { if(pointer!=NULL) { strcpy(pointer->data, data); return ST_SUCCESS; } else return 1; } string_s* stringlist::walk(unsigned int number) { unsigned int walker = number % 4; unsigned int walkersteps = ((unsigned int) number / 4 ); string_s* pointer = first; for(unsigned int i=0; i<walkersteps ;i++) { pointer = pointer->next->next->next->next; } switch(walker) { case 1: pointer=pointer->next; break; case 2: pointer=pointer->next->next; break; case 3: pointer=pointer->next->next->next; break; } return pointer; } unsigned int stringlist::find(const char* s) { string_s* pointer = first; unsigned int i; for(i=0; ;i++) { if(*pointer->data == *s) { if(0==strcmp(pointer->data, s)) { return i; } } pointer = pointer->next; } return ST_INDEX_OVER; } string_s* stringlist::operator[](unsigned int index) { return walk(index); } stringlist::stringlist() { first = NULL; end=NULL; create("\0"); end=first; } stringlist::~stringlist() { while(delete_entry(end)!=NULL); } int main() { char s[32]; stringlist list; list.create("test string"); string_s* first_element = list[1]; list.get(first_element, s); printf("%s\n",s); getc(stdin); return EXIT_SUCCESS; } |
Сообщ.
#20
,
|
|
|
Интересный... велосипед...
А чем стандартный std::list не подошел? А почему malloc, а не new? А почему string_s - глобальная структура, её ещё где-то можно использовать? А почему класс stringlist распоряжается памятью для string_s? А что это за макросы ST_INDEX_OVER и т.п.? Без них нельзя? А как мне изменить строку в этом списке, например, прибавить к ней еще пару символов? А что за глобальная переменная null_pointer? |
Сообщ.
#21
,
|
|
|
Цитата BioUnit, 5.12.04, 20:56, 533584 А что это за макросы ST_INDEX_OVER и т.п.? Без них нельзя? Коды ошибок Цитата BioUnit, 5.12.04, 20:56, 533584 А как мне изменить строку в этом списке, например, прибавить к ней еще пару символов? stringlist::set Цитата BioUnit, 5.12.04, 20:56, 533584 А что за глобальная переменная null_pointer? НЕ помню ![]() |
Сообщ.
#22
,
|
|
|
Мяут, объясни мне, плз, одну вещь: а нафига?
Такой свой велосипед написать может практически каждый. При этом из минусов можно сразу отметить ошибки(без них редко обходятся даже такие простые классы), отсутствие документации. Часто страдает эффективность. Еще интересный вопрос - обработка ошибок. Это же тоже надо все описывать, когда что возвращается/какое исключение кидается. Как я понимаю, цель данной статьи заключается в том, чтобы помочь выбрать из уже существующего огромного количества библиотек нужную или их эффективную комбинацию. Влезая со своим очередным классом, ты вносишь еще больше путаницы, которой и так достаточно. |
Сообщ.
#23
,
|
|
|
M Прошу обратить внимание на Правила раздела (вверху страницы) и впредь придерживаться их |
Сообщ.
#24
,
|
|
|
byte, я тренировался односвязные списки писать
![]() |