На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Закрыто archimed7592 11-03-2008: Лимит страниц. Продолжаем Delphi vs C++

Страницы: (117) « Первая ... 30 31 [32] 33 34 ...  116 117  ( Перейти к последнему сообщению )  
> Delphi vs C++ , Часть 1
    Цитата archimed7592 @
    т. е. на каждой строчке ровно по N токенов, разделённых ';' без доп. случаев аля

    В отдельных частях строки между разделителями символов-разделителей не будет, заключаться в кавычки они тоже не будут.

    Цитата archimed7592 @
    под порядком вывода я имел ввиду обязательно ли группировать данные?

    Обязательно ;) То есть в результате парсинга списка, приведенного в предыдущем моем посте, должно получится аналогичное дерево, которое я показал в условии задачи.
      archimed7592- круто конечно..
      это под какой компилятор? а то меня сl.exe с пятой студии, и intel6 (юзает хидеры с 5-ой), послали :'( причем каждый с разными ошибками.

      Добавлено
      да.. и какая хоть инструкция к применению?

      ps.
      код на дельфи весьма неоптимален - юзает VCL TStringList, и иногда подвисает и вываливаеться 'run-time-error'.. а так да - консольные проги, это вещь ..
        n0p, mingw-3.4.2... даю 100%, что будет работать и в vs2005 и 99% в vs2003...
        инструкция - со стандартного ввода читаются строки (до конца файла), на стандартный вывод выдаётся множество строк

        Добавлено
        Цитата n0p @
        юзает VCL TStringList, и иногда подвисает и вываливаеться 'run-time-error'
        :lol: ты, дельфист, только что высказался, что "дельфи сакс" :lol: :lol: :lool:

        Добавлено
        Smike, что с повторяющимися элементами?

        Добавлено
        типа
        ExpandedWrap disabled
          Категория3;Подкатегория2;Элемент1
          Категория1;Подкатегория1;Элемент1
          Категория1;Подкатегория1;Элемент2
          Категория3;Подкатегория2;Элемент1
          Категория1;Подкатегория1;Элемент1
          Категория1;Подкатегория1;Элемент2
          Категория3;Подкатегория2;Элемент1
          Категория1;Подкатегория1;Элемент1
          Категория1;Подкатегория1;Элемент2
          У меня вариант "в первом приближении" готов:
          ExpandedWrap disabled
            // StringsToMap.cpp : Defines the entry point for the console application.
            //
             
            #include "stdafx.h"
             
            #include <fstream>
            #include <iostream>
            #include <string>
            #include <map>
            #include <boost/algorithm/string/find_iterator.hpp>
            #include <boost/algorithm/string/find.hpp>
            #include <algorithm>
            #include <functional>
             
            class StringsTree;
             
            using namespace boost;
            using namespace algorithm;
             
            class StringsTree
            {
            public:
                typedef std::map<std::string, StringsTree*> Children;
                Children m_Children;
             
                template<typename FwdIt> void AddBranch(FwdIt cur, FwdIt end);
             
                friend std::ostream& operator << (std::ostream& os, const StringsTree& t)
                {
                    t.OutputBranches(os, "");
                    return os;
                }
            private:
                void OutputBranches(std::ostream& os, const std::string& indent) const
                {
                    std::string next_level = indent + "  ";
             
                    Children::const_iterator p = m_Children.begin();
                    for (; p != m_Children.end(); ++ p)
                    {
                        os << indent << p->first << '\n';
                        p->second->OutputBranches(os, next_level);
                    }
                }
            };
             
            template<typename FwdIt> void StringsTree::AddBranch(FwdIt cur, FwdIt end)
            {
                if (cur == end)
                    return;
                
                std::string child = copy_range<std::string>(*cur);
                if (child.empty())
                    return;
                    
                Children::iterator p = m_Children.find(child);
                if (p == m_Children.end())
                {
                    StringsTree* branch = new StringsTree;
                    m_Children[child] = branch;
                    branch->AddBranch(++ cur, end);
                }
                else
                    p->second->AddBranch(++ cur, end);
            }
             
             
            int main(int argc, char* argv[])
            {
                std::ifstream in("test.txt");
             
                StringsTree root;
             
                while (!in.eof())
                {
                    std::string line;
                    std::getline(in, line);
             
                    typedef split_iterator<std::string::iterator> string_split_iterator;
                    string_split_iterator it = make_split_iterator(line, first_finder(";", is_equal()));
                    root.AddBranch(it, string_split_iterator());
                }
             
                std::cout << root;
                
                return 0;
            }


          На тестовом коде выдает положенные:
          ExpandedWrap disabled
            Категория1
              Подкатегория1
                Элемент1
                Элемент2
                Элемент3
              Подкатегория2
                Элемент1
                Элемент2
              Подкатегория3
                Элемент1
            Категория2
              Подкатегория1
                Элемент1
                Элемент2
            Категория3
              Подкатегория1
                Элемент1
              Подкатегория2
                Элемент1
            Цитата archimed7592 @
            Smike, что с повторяющимися элементами?

            нет :no:

            Добавлено
            Точнее если будет повторяться
            ExpandedWrap disabled
              Категория1;Подкатегория1;Элемент1
              Категория1;Подкатегория1;Элемент1

            то это можно игнорировать. Суть не в этом. А вот одинаковые подкатегории в одной категории следует группировать.
              у меня тож :) а дельфисты со своим "простым языком" всё никак не родят :lol:
              ExpandedWrap disabled
                #include <cstddef>
                #include <istream>
                #include <ostream>
                #include <iostream>
                #include <string>
                #include <set>
                #include <map>
                 
                void produce (std::istream &sin, std::ostream &sout)
                {
                    typedef std::set <std::string > level3;
                    typedef std::map < std::string, level3 > level2;
                    typedef std::map < std::string, level2 > level1;
                 
                    typedef level1 container;
                    const char delim = ';';
                 
                    container c;
                    
                    while (!sin.eof ())
                    {
                        std::string s1, s2, s3;
                        std::getline (sin, s1, delim);
                        std::getline (sin, s2, delim);
                        std::getline (sin, s3, '\n');
                        c[s1][s2].insert (s3);
                    }
                    
                    for (level1::const_iterator i1 = c.begin (); i1 != c.end (); ++i1)
                    {
                        sout << i1->first << std::endl;
                        for (level2::const_iterator i2 = i1->second.begin (); i2 != i1->second.end (); ++i2)
                        {
                            sout << "  " << i2->first << std::endl;
                            for (level3::const_iterator i3 = i2->second.begin (); i3 != i2->second.end (); ++i3)
                            {
                                sout << "    " << *i3 << std::endl;
                            }
                        }
                    }
                            
                }
                 
                 
                int main ()
                {
                    produce (std::cin, std::cout);
                 
                    return 0;
                }

              вывод на тестовых данных правильный
                archimed7592-прикинь, скомпилилось на intel c++, с хидерами от Vc7. Вроде работает. Довольно шустро (ну это надо отдать должное компилятору промышленного класса). а M$явочный так и не осилел. ругаеться на

                ExpandedWrap disabled
                  getline_iterator ()
                          : stream (*reinterpret_cast < std::istream * > (NULL))  
                      { //на этом месте..
                      }


                Пишет что..
                Цитата

                sort.cpp(19) : error C2354: 'getline_iterator::stream' : initialization of reference member requires a temporary variable


                Так что ты нарушил какието правила языка С++ (интеловский, допускает некоторые вольности в этом плане.)

                Кстати у мну прога довольно мелкая вышла 32-кб.. но использует много вызовов в либы msvcr70/msvcp70.dll а у тя скок?
                  Цитата archimed7592 @
                  getline_iterator () : stream (*reinterpret_cast < std::istream * > (NULL)) { }

                  Кстати, да. Весьма стремно - инициализация ссылки в классе временным объектом, да еще и преобразованным нулевым указателем - это жесть... :)
                    пофиксил

                    Добавлено
                    Цитата n0p @
                    Кстати у мну прога довольно мелкая вышла 32-кб.. но использует много вызовов в либы msvcr70/msvcp70.dll а у тя скок?
                    vs2005-release: 14 KiB
                    mingw-3.4.2 ($ g++ -mthreads -O2 -g0 -o set.exe ~/set.cpp -I./stlport -L./bin -lstlport.5.1): 63 KiB
                    mingw-3.4.2 ($ g++ -o set-d.exe -O2 -g0 -o set.exe ~/set.cpp): 470 KiB
                      от нечего делать малость "прошаблонил" свой код... 15 мин и теперь можно выставлять произвольную глубину вложенности, а также безболезненно добавлять и другие ф-ции, кроме вывода на экран (print)... сколько времени уйдёт на это в дельфи? даже представить себе боюсь...
                      ExpandedWrap disabled
                        #include <cstddef>
                        #include <istream>
                        #include <ostream>
                        #include <iostream>
                        #include <string>
                        #include <set>
                        #include <map>
                        #include <vector>
                         
                        /* ========================================================================== */
                         
                        template < std::size_t Depth >
                        struct select;
                         
                        template < >
                        struct select < 1 >
                        {
                            template < typename Return_type, typename Container, typename ForwardIterator >
                            Return_type get (Container &c, ForwardIterator first)
                            {
                                return c [*first];
                            }
                        };
                         
                        template < std::size_t Depth >
                        struct select
                        {
                            template < typename Return_type, typename Container, typename ForwardIterator >
                            Return_type get (Container &c, ForwardIterator first)
                            {
                                select < Depth - 1 > sel;      
                                return sel.get < Return_type > (c [*first], first + 1);
                            }
                        };
                         
                        /* ========================================================================== */
                         
                        template < std::size_t Depth >
                        struct iterate;
                         
                        template < >
                        struct iterate < 1 >
                        {
                            template < typename Container >
                            void print (std::ostream &sout, std::string prefix, Container &c)
                            {
                                for (typename Container::const_iterator i = c.begin (); i != c.end (); ++i)
                                    sout << prefix << *i << std::endl;
                            }
                        };
                         
                        template < std::size_t Depth >
                        struct iterate
                        {
                            template < typename Container >
                            void print (std::ostream &sout, std::string prefix, Container &c)
                            {
                                for (typename Container::const_iterator i = c.begin (); i != c.end (); ++i)
                                {
                                    sout << prefix << i->first << std::endl;
                                    iterate < Depth - 1 > iter;
                                    iter.print (sout, prefix + "  ", i->second);
                                }
                            }
                        };
                         
                        /* ========================================================================== */
                         
                        template < std::size_t Depth >
                        struct eval_container;
                         
                        template < >
                        struct eval_container < 1 >
                        {
                            typedef std::set < std::string > type;
                        };
                         
                        template < std::size_t Depth >
                        struct eval_container
                        {
                            typedef std::map < std::string, typename eval_container < Depth - 1>::type > type;
                        };
                         
                        /* ========================================================================== */
                         
                        void produce (std::istream &sin, std::ostream &sout)
                        {
                            const char delim = ';';
                            const std::size_t depth = 3;
                            typedef eval_container < depth >::type container;
                         
                            container c;
                            
                            while (!sin.eof ())
                            {
                                typedef std::vector < std::string > tokens_container;
                                tokens_container tokens (depth);
                                tokens_container::iterator i = tokens.begin ();
                                for (tokens_container::iterator end = tokens.end () - 1; i != end; ++i)
                                    std::getline (sin, *i, delim);
                                    
                                std::getline (sin, *i, '\n');
                         
                                if (sin.eof ())
                                    break;
                         
                                select < depth - 1 > sel;
                                sel.get < eval_container < 1 >::type & > (c, tokens.begin ()).insert (*i);
                            }
                            
                            iterate < depth > iter;
                            iter.print (sout, std::string (), c);
                        }
                         
                         
                        /* ========================================================================== */
                         
                        int main ()
                        {
                            produce (std::cin, std::cout);
                         
                            return 0;
                        }
                        Цитата archimed7592
                        пофиксил

                        да неужели? опять ругань

                        ExpandedWrap disabled
                          void produce (std::istream &sin, std::ostream &sout)
                          {    
                             typedef std::set < std::string > container;    
                          //еггор на этом контейнере >:(
                             container c ((getline_iterator (sin)), (getline_iterator ()));


                        Цитата

                        sort.cpp(61) : error C2061: syntax error : identifier 'sin'
                        sort.cpp(61) : error C2066: cast to function type is illegal
                        ...cut


                        интеловский скомпилил.. но он - тормоз! :angry: билд проги почти 6 секунд! на дельфи от силы же все за пол! (0.5sek) за пол секунды.. простейшие же проги как
                        ExpandedWrap disabled
                          program hello;
                          begin
                           writeln ('Hello World');
                          end.

                        Цитата

                        Borland Delphi for Win32 compiler version 18.0
                        Copyright © 1983,2005 Borland Software Corporation

                        оформляет за
                        Цитата

                        hello.pas(4)
                        5 lines, 0.01 seconds, 2652 bytes code, 1772 bytes data.

                        так что насчет 'сакса', ты обожди чутку. тем более что алго с VCL TStringList я срисовал откудато.

                        Цитата
                        vs2005-release: 14 KiB

                        хм.. стряння.. как M$-ишный линкер пропустил этот косяк???
                        ExpandedWrap disabled
                          int main ()
                          {

                        без
                        ExpandedWrap disabled
                          int _cdecl main ()
                          {

                        я получаю лишь заявление
                        Цитата

                        LINK : fatal error LNK1561: entry point must be defined


                        :blink:

                        Добавлено
                        кстати не можешь приаттачить скомпиленый в vs2005, столь мелкую ексешку? а то ковырнуть уж больно интересно. в intel все опции перебрал. ну не делает меньше 32-кб (ественно покавать UPX-ом, есть моветон, а aspack'ом так вообще великий грех)

                        Добавлено
                        На ВCC5.5, пробовать пока недосуг (но я обязательно это сделаю).

                        Добавлено
                        Цитата archimed7592
                        от нечего делать малость "прошаблонил" свой код...

                        ну понятно что от костыля в виде STD (а по мне так инвалидной коляски), нам избавиться слабо. Незачет также отсутствие камментоф. Пробовать новый релиз уже как то влом. Боюсь еггоров опять не оберешся.
                          Цитата n0p @
                          да неужели? опять ругань
                          скачай mingw... самый норм компилятор... если влом, то попробуй исправить на container c (getline_iterator (sin), getline_iterator ());
                          Цитата n0p @
                          ну не делает меньше 32-кб
                          ну выравнивание у него такое... че ж поделать... файлик в атаче

                          Цитата n0p @
                          ну понятно что от костыля в виде STD (а по мне так инвалидной коляски), нам избавиться слабо
                          my god! ну давай ещё похоливарим насчёт стиля с++ программирования, а именно о вреде using namespace std ?
                          Цитата n0p @
                          Незачет также отсутствие камментоф
                          для плюсистов, думаю там всё понятно... в двух словах
                          select<N>::get (container &c, iterator i) возвращает c[*i][*(i+1)][*(i+2)]...[*(i+N-1)]
                          eval_container<N>::type определяет тип map<string, map<string, map<string, ..., map <string, set<string>>...>>> т. е. типа само деревцо...
                          iterate<N>::print делает то же, что делало 3 for'а в предыдущем варианте, только делает это универсально (N for'ов)...
                          т. о. я спокойно могу сменить map на hash_map и/или set на hash_set и/или увеличить вложенность структуры и/или добавить подобную print (но другую) функцию и мне не придётся делать никаких copy-paste/ctrl-f/ctrl-h/etc. вообще никаких телодвижений не понадобится... и всё это за 30 мин (15 мин первоначальный вариант+15 мин подгон к шаблонам)... и это учитывая, что я знаю только 20% stl (хорошо, если не меньше) и почти не знаю boost... а так, это можно было бы сделать в разы более красиво, компактно, лаконично... вот и делай выводы, какой дельфи супер-пупер язык, с которым и мечтать о таком нельзя...
                          Сообщение отредактировано: archimed7592 -
                            эээ...атач забыл :)
                            Прикреплённый файлПрикреплённый файлw32_con.zip (6.76 Кбайт, скачиваний: 65)
                              Цитата archimed7592
                              вот и делай выводы, какой дельфи супер-пупер язык

                              согласен, руль! особено в консоли, где мне очень важна наверно быстрая реакция, на нажатие клавиши enter в FAR'е по сорцу на дельфи и получение моментальной компиляции-запуска, и собственно работы проги. Так что юзаю дельфи, ну почти как bat-скрипт, ток в трансляции в маш-код, и иной раз вылетом за предел 3-его кольца, чтоб там, без напрягов поюзать ассемблер(к примеру).

                              Ну а возможностей языка для меня вполне хватает.. чтоб допустим наваять несложную утилитку, тогоже запуска дельфи-скриптов.

                              ExpandedWrap disabled
                                program exe_script; uses windows;
                                 
                                function shell (const cmd:string; out:boolean):integer;
                                var pi:TProcessInformation; si:TStartupInfo; ExCode:dword;
                                begin
                                    FillChar(si,sizeof(si),0); //предохраниться от глюк
                                    si.wShowWindow := 1;
                                    si.cb := sizeof(si);
                                    if out = false then si.dwFlags := STARTF_USESTDHANDLES;
                                    CreateProcessA ( nil, pchar(cmd), nil, nil,
                                    false, $20, nil, nil, si, pi);
                                    WaitForSingleObject(pi.hProcess, Infinite);
                                    GetExitCodeProcess(pi.hProcess,ExCode);
                                    CloseHandle(pi.hProcess);
                                    Result := ExCode;
                                end;
                                 
                                var str : string;
                                begin
                                    str := ParamStr (1); //получить имя файла из командной строки
                                    if shell ('dcc32 '+Str, false) <> 0 then //скомпилить без вывода инфы
                                    begin               //в случае облома
                                       shell ('dcc32 '+Str, true);//скомпилить с выводом мессаги  
                                     exit; // и выйти..
                                    end;// в случае успеха
                                      SetLength (str, length(str)-3 );//убрать расширение
                                    shell (Str+'exe',true);//запустить прогу
                                end.


                              Цитата archimed7592
                              эээ...атач забыл

                              угу..сенькс.. ну надоже, уже msvcr80/msvcp80.dll рулят. бугага, как говориться найдите пару отличий.. от предыдущих версий.

                              Добавлено
                              зы: archimed7592 - прикинь консольный дельфи компилер эту win32api-прогу оформил за
                              Цитата

                              0.08 seconds

                              а за скок уложиться vs2005 или самый норм компилятор mingw, особенно при подключении файлека <windows.h>??? :)
                                Delphi конечно очень удобен, но если нужно что-нибудь компактное и быстрое, если недостает оперативки, то лучше C++ ничего не найти.
                                А вообще, это дело привычки какой язык использовать. Другое дело если стоишь перед выбором какой язык начать изучать. Delphi конечно попроще в изучении и ВУЗах преподают в основном Pascal, но если серьезно решил заняться кодингом выучи один язык, второй дастся легче. Знание нескольких языков программирования-это неизбежность для профессионала.
                                :) "А для чего на свете мед? Чтобы я его ел, помоему так." В.Пух
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (117) « Первая ... 30 31 [32] 33 34 ...  116 117
                                Закрыто archimed7592 11-03-2008: Лимит страниц. Продолжаем Delphi vs C++



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