Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.249.247] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
iterator elem = std::find_if(mylist.begin(), mylist.end(), &findFunc); pan2004, да, точно...совсем забыл про нее...ну смысл тот же |
Сообщ.
#17
,
|
|
|
pan2004 ну а теперь перечисли недостатки шаблонов ?
когда ходишь на ходулях . можно с них быстрее слететь. шаблоны требуют еще большего знания и опыта. поэтому не надо спешить лезть на ходули . грабли могут и там тебя достать. |
Сообщ.
#18
,
|
|
|
Цитата pan2004 ну а теперь перечисли недостатки шаблонов ? когда ходишь на ходулях . можно с них быстрее слететь. шаблоны требуют еще большего знания и опыта. поэтому не надо спешить лезть на ходули . грабли могут и там тебя достать. углубление в мето-программирование и конструкцию языка еще ни кому не помешали... в твоих словах я вижу только нежелание... |
Сообщ.
#19
,
|
|
|
Цитата qwone @ pan2004 ну а теперь перечисли недостатки шаблонов ? Недостатки? Полно, не спорю. Например, в большинстве компиляторов до сих пор не реализован экспорт шаблонов, так что они - вещи из категории "header only". В смысле кусок шаблона в библиотеку не скомпилируешь, чтобы он там шаблоном и остался. А если серьезно - нужно бы сравнивать с аналогичными средствами других языков. Таковых я не знаю(очень часто их сравнивают с generics, но это все равно что классы C++ с сишными структурами сравнивать). Цитата qwone @ когда ходишь на ходулях . можно с них быстрее слететь. шаблоны требуют еще большего знания и опыта. Требуют, но начинать то когда-то надо? А то и будете для каждого нового типа данных свой "вектор" изобретать. Кстати, чтобы из этого класса сделать нормальный шаблон, нужно 5 минут(и еще 5 минут потратить на то, чтобы прочитать в учебнике статью - правильно говорят, у страха глаза велики). Для начала уже ничего. Потом присмотритесь к STL, всяких векторов и проч. Цитата qwone @ поэтому не надо спешить лезть на ходули . грабли могут и там тебя достать. Дело не в том, что они могут достать, а в том, сколько раз на одни и те же наступишь. Допустим, у тебя в программе пяток подобных классов(как массив к разным типам). Понадобилось добавить конструктор копирования, и придется править каждый, считай 5 раз на грабли наступил(а то и больше, простого копипаста может быть мало). Был бы шаблон - то почуствовал бы всего один удар деревяшкой по лбу). Юзал бы STL - и не пришлось бы вовсе суетится) |
Сообщ.
#20
,
|
|
|
pan2004
почему я не птица - почему не летаю . Если бы юзал STL то и код был другой . Mожет через месяц будет иначе . И код изменится .Но пока это то что я имею . И то что я собрал . А это неплохая заготовка для идущих следом . Добавлено А я пытался сделать шаблон из этого - не получилось . Сможешь сделай . Да и как запустить .с mail тест файлом. |
Сообщ.
#21
,
|
|
|
Пожалуйста.
template <typename T> //Раз class truk { private: T* pT; //Два int Len; public: truk() { pT = 0;//new T; ?Зачем тут new вообще? Len=0; } truk(truk<T>& const rhs)//Вот этого не было { if (rhs.pT){ pT = new T[rhs.Len]; for (int i = 0; i < rhs.Len; ++i) pT[i] = rhs.pT[i];} else pT = 0; Len = rhs.Len; } ~truk() { delete []pT; Len=0; } void clear() { delete []pT; pT = 0;//new struk[0]; Тоже - к черту new Len=0; } void add(T & const St)// Про указатели константности не забываем, когда полезно { T *pT2= new T[Len+1]; for(int i=0;i<Len;++i)//Вот это может занимать до 99% времени работы программы. Изменять тут ничего не буду - лучше сразу юзать std::vector<> pT2[i]=pT[i]; pT2[Len++]=St; delete []pT; pT=pT2; } T get(int i)const//Ха, тут даже не получится элемент контейнера извне изменить! { if (i > Len) i=Len; if (i <= 0) i = 1; return pT[i-1]; } void del(int i) { // А если мало элементов? if (Len == 0 || (Len == 1 && i == 1)) { Len = 0; delete []pT; pT = 0; return; } if ((i<=Len)&&(i>0)) { i--; T *pT2= new T[Len-1]; int j,k; for(j=k=0;k<Len;j++,k++){ if (i==j) k++; pT2[j]=pT[k]; } delete []pT; pT=pT2; Len--; } } }; сложно? |
Сообщ.
#22
,
|
|
|
спасибо.
где то подобное я переставлял себе . может бы пару моментов бы упустил .Или не пару. только не думаю что vector быстрее будет . хотя С++ не ассемблер и компилятор не идеальный код сделает . только вот не пойму как vector это обойдет . |
Сообщ.
#23
,
|
|
|
Цитата только вот не пойму как vector это обойдет . дело в том что вестор выделяет память на много элементов вперед. т.е. релокация памяти происходит не каждое добавление, а только тогда, когда место поджмает. и когда удаляются элементы, память не особождается. т.е. если был вектор на 10 элементов, а добавили 100, то после удаления размер заризервированной памяти так и остантся для 100 элементов. |
Сообщ.
#24
,
|
|
|
qwone: не заметил, отписал последний вопрос и завалился спать. Так что торжественное спасибо, it's work =)
Добавлено Но все таки, если мне нужно быстрое решение по добавлению и удалению элементов - лучше использовать list? Плюс - как искать по конкретному "столбцу" части элемента понятно, очень прошу объяснить как к конкретному элеенту обратиться. Я сейчас мечусь между готовым классом от qwone и потенциально быстрым list... И <base_class><list_class>::<..._...> ... и ещё много такого в объявлении list честно говоря пугают =) |
Сообщ.
#25
,
|
|
|
вожусь с list. по примеру из книжки не хочет работать
struct base { int type; HANDLE h1; HANDLE h2; std::string mem_page; DWORD page_size; }; std::list <base> hold; main{ // не пашет добавление =( hold.push_back(base(i, 0,0,"",0)); // мне при создании элемента нужно записать type и h1, остальные элементы не определенны ... find // теперь найти по h1? // и сразу записать в этот элемент значение h2 и mem_page // а теперь по h2 найти элемент и удалить его |
Сообщ.
#26
,
|
|
|
конструктор определи для структуры.
А еще лучше - почитай что-нибудь умное по C++ |
Сообщ.
#27
,
|
|
|
Цитата freecod @ вожусь с list. по примеру из книжки не хочет работать struct base { int type; HANDLE h1; HANDLE h2; std::string mem_page; DWORD page_size; }; std::list <base> hold; main{ // не пашет добавление =( hold.push_back(base(i, 0,0,"",0)); // мне при создании элемента нужно записать type и h1, остальные элементы не определенны ... find // теперь найти по h1? // и сразу записать в этот элемент значение h2 и mem_page // а теперь по h2 найти элемент и удалить его Что за книжка такая, в которой такую чушь пишут ? Как уже сказал trainer, определи конструктор, который вызываешь при помещении элемента в список. Вот тут, ты вызываешь конструктор base( i, 0, 0, "", 0 ): hold.push_back(base(i, 0,0,"",0)); Но определние этого конструктора в описании класса отсутствует. struct base { int type; HANDLE h1; HANDLE h2; std::string mem_page; DWORD page_size; // добавляем конструктор: base( int, HANDLE, HANDLE, const std::string &, DWORD ); }; Ну и естественно, нужно реализовать этот конструктор Может быть еще дефолтовый конструктор тоже понадобится. |
Сообщ.
#28
,
|
|
|
Цитата Может быть еще дефолтовый конструктор тоже понадобится. понадобится... |
Сообщ.
#29
,
|
|
|
Цитата maxim84_ @ Цитата Может быть еще дефолтовый конструктор тоже понадобится. понадобится... Теоретически - необязательно. |
Сообщ.
#30
,
|
|
|
freecod можно бы и и сделать вектороподобным - алгоритм <vector> я понял как он работает . там надо просто с запасом брать память и просто двигать , а не создавать заново.
или даже <deque> . <list> тоже можно эмулировать .Hо действительно , как сказал pan2004 надо расти дальше . Вот и буду расти. |