
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.5] |
![]() |
|
Страницы: (117) « Первая ... 30 31 [32] 33 34 ... 116 117 ( Перейти к последнему сообщению ) |
Сообщ.
#466
,
|
|
|
Цитата archimed7592 @ т. е. на каждой строчке ровно по N токенов, разделённых ';' без доп. случаев аля В отдельных частях строки между разделителями символов-разделителей не будет, заключаться в кавычки они тоже не будут. Обязательно ![]() |
Сообщ.
#467
,
|
|
|
archimed7592- круто конечно..
это под какой компилятор? а то меня сl.exe с пятой студии, и intel6 (юзает хидеры с 5-ой), послали ![]() Добавлено да.. и какая хоть инструкция к применению? ps. код на дельфи весьма неоптимален - юзает VCL TStringList, и иногда подвисает и вываливаеться 'run-time-error'.. а так да - консольные проги, это вещь .. |
![]() |
Сообщ.
#468
,
|
|
n0p, mingw-3.4.2... даю 100%, что будет работать и в vs2005 и 99% в vs2003...
инструкция - со стандартного ввода читаются строки (до конца файла), на стандартный вывод выдаётся множество строк Добавлено Цитата n0p @ юзает VCL TStringList, и иногда подвисает и вываливаеться 'run-time-error' ![]() ![]() ![]() ![]() Добавлено Smike, что с повторяющимися элементами? Добавлено типа ![]() ![]() Категория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 |
Сообщ.
#469
,
|
|
|
У меня вариант "в первом приближении" готов:
![]() ![]() // 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; } На тестовом коде выдает положенные: ![]() ![]() Категория1 Подкатегория1 Элемент1 Элемент2 Элемент3 Подкатегория2 Элемент1 Элемент2 Подкатегория3 Элемент1 Категория2 Подкатегория1 Элемент1 Элемент2 Категория3 Подкатегория1 Элемент1 Подкатегория2 Элемент1 |
Сообщ.
#470
,
|
|
|
Цитата archimed7592 @ Smike, что с повторяющимися элементами? нет ![]() Добавлено Точнее если будет повторяться ![]() ![]() Категория1;Подкатегория1;Элемент1 Категория1;Подкатегория1;Элемент1 то это можно игнорировать. Суть не в этом. А вот одинаковые подкатегории в одной категории следует группировать. |
![]() |
Сообщ.
#471
,
|
|
у меня тож
![]() ![]() ![]() ![]() #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; } вывод на тестовых данных правильный |
Сообщ.
#472
,
|
|
|
archimed7592-прикинь, скомпилилось на intel c++, с хидерами от Vc7. Вроде работает. Довольно шустро (ну это надо отдать должное компилятору промышленного класса). а M$явочный так и не осилел. ругаеться на
![]() ![]() 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 а у тя скок? |
Сообщ.
#473
,
|
|
|
Цитата archimed7592 @ getline_iterator () : stream (*reinterpret_cast < std::istream * > (NULL)) { } Кстати, да. Весьма стремно - инициализация ссылки в классе временным объектом, да еще и преобразованным нулевым указателем - это жесть... ![]() |
![]() |
Сообщ.
#474
,
|
|
пофиксил
Добавлено Цитата n0p @ vs2005-release: 14 KiBКстати у мну прога довольно мелкая вышла 32-кб.. но использует много вызовов в либы msvcr70/msvcp70.dll а у тя скок? 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 |
![]() |
Сообщ.
#475
,
|
|
от нечего делать малость "прошаблонил" свой код... 15 мин и теперь можно выставлять произвольную глубину вложенности, а также безболезненно добавлять и другие ф-ции, кроме вывода на экран (print)... сколько времени уйдёт на это в дельфи? даже представить себе боюсь...
![]() ![]() #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; } |
Сообщ.
#476
,
|
|
|
Цитата archimed7592 пофиксил да неужели? опять ругань ![]() ![]() 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 интеловский скомпилил.. но он - тормоз! ![]() ![]() ![]() 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$-ишный линкер пропустил этот косяк??? ![]() ![]() int main () { без ![]() ![]() int _cdecl main () { я получаю лишь заявление Цитата LINK : fatal error LNK1561: entry point must be defined ![]() Добавлено кстати не можешь приаттачить скомпиленый в vs2005, столь мелкую ексешку? а то ковырнуть уж больно интересно. в intel все опции перебрал. ну не делает меньше 32-кб (ественно покавать UPX-ом, есть моветон, а aspack'ом так вообще великий грех) Добавлено На ВCC5.5, пробовать пока недосуг (но я обязательно это сделаю). Добавлено Цитата archimed7592 от нечего делать малость "прошаблонил" свой код... ну понятно что от костыля в виде STD (а по мне так инвалидной коляски), нам избавиться слабо. Незачет также отсутствие камментоф. Пробовать новый релиз уже как то влом. Боюсь еггоров опять не оберешся. |
![]() |
Сообщ.
#477
,
|
|
Цитата n0p @ скачай mingw... самый норм компилятор... если влом, то попробуй исправить на container c (getline_iterator (sin), getline_iterator ());да неужели? опять ругань Цитата n0p @ ну выравнивание у него такое... че ж поделать... файлик в атачену не делает меньше 32-кб Цитата n0p @ my god! ну давай ещё похоливарим насчёт стиля с++ программирования, а именно о вреде using namespace std ?ну понятно что от костыля в виде 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... а так, это можно было бы сделать в разы более красиво, компактно, лаконично... вот и делай выводы, какой дельфи супер-пупер язык, с которым и мечтать о таком нельзя... |
![]() |
Сообщ.
#478
,
|
|
Сообщ.
#479
,
|
|
|
Цитата archimed7592 вот и делай выводы, какой дельфи супер-пупер язык согласен, руль! особено в консоли, где мне очень важна наверно быстрая реакция, на нажатие клавиши enter в FAR'е по сорцу на дельфи и получение моментальной компиляции-запуска, и собственно работы проги. Так что юзаю дельфи, ну почти как bat-скрипт, ток в трансляции в маш-код, и иной раз вылетом за предел 3-его кольца, чтоб там, без напрягов поюзать ассемблер(к примеру). Ну а возможностей языка для меня вполне хватает.. чтоб допустим наваять несложную утилитку, тогоже запуска дельфи-скриптов. ![]() ![]() 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>??? ![]() |
Сообщ.
#480
,
|
|
|
Delphi конечно очень удобен, но если нужно что-нибудь компактное и быстрое, если недостает оперативки, то лучше C++ ничего не найти.
А вообще, это дело привычки какой язык использовать. Другое дело если стоишь перед выбором какой язык начать изучать. Delphi конечно попроще в изучении и ВУЗах преподают в основном Pascal, но если серьезно решил заняться кодингом выучи один язык, второй дастся легче. Знание нескольких языков программирования-это неизбежность для профессионала. ![]() |