На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Нужна пара трюков
    ExpandedWrap disabled
      iterator elem = std::find_if(mylist.begin(), mylist.end(), &findFunc);

    pan2004, да, точно...совсем забыл про нее...ну смысл тот же :)
      pan2004 ну а теперь перечисли недостатки шаблонов ?
      когда ходишь на ходулях . можно с них быстрее слететь.
      шаблоны требуют еще большего знания и опыта.
      поэтому не надо спешить лезть на ходули . грабли могут и там тебя достать.
        Цитата
        pan2004 ну а теперь перечисли недостатки шаблонов ?
        когда ходишь на ходулях . можно с них быстрее слететь.
        шаблоны требуют еще большего знания и опыта.
        поэтому не надо спешить лезть на ходули . грабли могут и там тебя достать.

        углубление в мето-программирование и конструкцию языка еще ни кому не помешали...


        в твоих словах я вижу только нежелание...
          Цитата qwone @
          pan2004 ну а теперь перечисли недостатки шаблонов ?

          Недостатки? Полно, не спорю. Например, в большинстве компиляторов до сих пор не реализован экспорт шаблонов, так что они - вещи из категории "header only". В смысле кусок шаблона в библиотеку не скомпилируешь, чтобы он там шаблоном и остался.
          А если серьезно - нужно бы сравнивать с аналогичными средствами других языков. Таковых я не знаю(очень часто их сравнивают с generics, но это все равно что классы C++ с сишными структурами сравнивать).
          Цитата qwone @
          когда ходишь на ходулях . можно с них быстрее слететь.
          шаблоны требуют еще большего знания и опыта.

          Требуют, но начинать то когда-то надо? А то и будете для каждого нового типа данных свой "вектор" изобретать. Кстати, чтобы из этого класса сделать нормальный шаблон, нужно 5 минут(и еще 5 минут потратить на то, чтобы прочитать в учебнике статью - правильно говорят, у страха глаза велики). Для начала уже ничего. Потом присмотритесь к STL, всяких векторов и проч.
          Цитата qwone @
          поэтому не надо спешить лезть на ходули . грабли могут и там тебя достать.

          Дело не в том, что они могут достать, а в том, сколько раз на одни и те же наступишь. Допустим, у тебя в программе пяток подобных классов(как массив к разным типам). Понадобилось добавить конструктор копирования, и придется править каждый, считай 5 раз на грабли наступил(а то и больше, простого копипаста может быть мало). Был бы шаблон - то почуствовал бы всего один удар деревяшкой по лбу). Юзал бы STL - и не пришлось бы вовсе суетится)
            pan2004
            почему я не птица - почему не летаю . Если бы юзал STL то и код был другой . Mожет через месяц будет иначе .
            И код изменится .Но пока это то что я имею . И то что я собрал . А это неплохая заготовка для идущих следом .

            Добавлено
            А я пытался сделать шаблон из этого - не получилось . Сможешь сделай . Да и как запустить .с mail тест файлом.
              Пожалуйста.
              ExpandedWrap disabled
                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--;
                        }
                    }
                };

              сложно?
              Сообщение отредактировано: pan2004 -
                спасибо.
                где то подобное я переставлял себе . может бы пару моментов бы упустил .Или не пару.
                только не думаю что vector быстрее будет . хотя С++ не ассемблер и компилятор не идеальный код сделает .
                только вот не пойму как vector это обойдет .
                  Цитата
                  только вот не пойму как vector это обойдет .

                  дело в том что вестор выделяет память на много элементов вперед. т.е. релокация памяти происходит не каждое добавление, а только тогда, когда место поджмает. и когда удаляются элементы, память не особождается. т.е. если был вектор на 10 элементов, а добавили 100, то после удаления размер заризервированной памяти так и остантся для 100 элементов.
                    qwone: не заметил, отписал последний вопрос и завалился спать. Так что торжественное спасибо, it's work =)

                    Добавлено
                    Но все таки, если мне нужно быстрое решение по добавлению и удалению элементов - лучше использовать list? Плюс - как искать по конкретному "столбцу" части элемента понятно, очень прошу объяснить как к конкретному элеенту обратиться. Я сейчас мечусь между готовым классом от qwone и потенциально быстрым list... И <base_class><list_class>::<..._...> ... и ещё много такого в объявлении list честно говоря пугают =)
                      вожусь с 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 найти элемент и удалить его
                        конструктор определи для структуры.
                        А еще лучше - почитай что-нибудь умное по C++
                          Цитата 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 ):
                          ExpandedWrap disabled
                            hold.push_back(base(i, 0,0,"",0));

                          Но определние этого конструктора в описании класса отсутствует.
                          ExpandedWrap disabled
                            struct base {
                                int type;
                                HANDLE h1;
                                HANDLE h2;
                                std::string mem_page;
                                DWORD page_size;
                                // добавляем конструктор:
                                base( int, HANDLE, HANDLE, const std::string &, DWORD );
                             
                            };

                          Ну и естественно, нужно реализовать этот конструктор ;)
                          Может быть еще дефолтовый конструктор тоже понадобится.
                          Сообщение отредактировано: D_KEY -
                            Цитата
                            Может быть еще дефолтовый конструктор тоже понадобится.

                            понадобится...
                              Цитата maxim84_ @
                              Цитата
                              Может быть еще дефолтовый конструктор тоже понадобится.

                              понадобится...

                              Теоретически - необязательно.
                                freecod можно бы и и сделать вектороподобным - алгоритм <vector> я понял как он работает . там надо просто с запасом брать память и просто двигать , а не создавать заново.
                                или даже <deque> . <list> тоже можно эмулировать .Hо действительно , как сказал pan2004 надо расти дальше .
                                Вот и буду расти.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0377 ]   [ 15 queries used ]   [ Generated: 18.05.24, 12:14 GMT ]