| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Классы hashtable, idictionary и другие для Win32 |
| Автор: Killerman 23.6.2009, 09:18 |
| Кто знает, какие классы из STL или может каких то других библиотек есть для Win32 вместо .NET-ских Hastable, Dictionary и т.д. классы map<> и set<> из STL не устраивают. И немного напрягает работа с итераторами. То, что для .NET-ских классов выглядит как простой вызов функции, для STL классов превращается в длинную писанину. |
| Автор: jonie 23.6.2009, 09:31 |
| STL для Win32 ?! это что-то новенькое. http://www.cplusplus.com/reference/stl/ вот перечень контейнеров |
| Автор: Rififi 23.6.2009, 09:37 |
| Killerman, какие классы из STL без итераторов - никакие. классы map<> и set<> из STL не устраивают. тогда делать свои поделки |
| Автор: jonie 23.6.2009, 10:05 |
| дак и в .net тоже итераторы есть (IEnumerable или IEnumerable<T> почти наследуются все коллекции тамошние)... |
| Автор: Rififi 23.6.2009, 10:15 |
| jonie, дак и в .net тоже итераторы есть т-с-с-с! а то спугнёшь |
| Автор: Killerman 23.6.2009, 10:27 |
| jonie, дак и в .net тоже итераторы есть Есть, но их не нужно использовать явно. А класс hashtable я вообще не нашел для Win32. Я просто подумал. может есть какая то дополнительная библиотека независимых разработчиков.... |
| Автор: Lazin 23.6.2009, 10:58 | ||
используй boost foreach, либо алгоритмы
|
| Автор: Killerman 23.6.2009, 11:25 | ||
| W4FhLF Killerman, а чем конкретно стандартные map и set не устраивают? Ну тем, что все оно какое то роботское. К примеру в map нельзя проверить, что елемент какой то не существует через: map<int, char,ltd::less<int>> m1; if(map[10] ==NULL) //error Через map[10] можно только изменить значение, но не вывести результат. Получается мне нужно сначала создать итератор:
Ну короче ясно о чем я. Или еще такой прикол, к примеру мне нужно динамически создать список, ну вот так: std::deque<int> * s1 = new std::deque<int>; поработать с нима, потом обратиться к элементу 10-ть этого списка. Для этого приходится делать так: (*s1)[10]; //выглядит не очень читабельно. Все усложняется, когда эти конструкции более вложенные: Бывает и такое: (*list1[i])[j]; и такое: nd->SetAtributes("F1", new BitArray(*((BitArray*)nd->Childs()[0]->GetAtributes("F1")))); И иногда вспоминаешь С#, где просто обращаешся через всю иерархию классов через простую точку: с1.с2[i].c3.c4.................. А де этот boost скачать? |
| Автор: W4FhLF 23.6.2009, 11:38 | ||||||||
Добавлено через 1 минуту и 27 секунд
Добавлено через 2 минуты и 37 секунд
А такие конструкции, как правило, связаны с ошибками архитектуры и проектирования. |
| Автор: Killerman 23.6.2009, 12:22 |
| C ->at(10) это да. Немного удобнее. Но по поводу архитектуры не согласен. Просто если конструкция не очень сложная, то все рабоает неплохо. А когда задача усложняется, то Win32 начинает очень заметно проигрывать Net-у в читабельности и быстроте написания. Особенно заметно это для объектов с динамически-выделяемой памятью. |
| Автор: xvr 23.6.2009, 12:30 | ||||||
Оно и для сложных неплохо работает
Тогда будет все нормально |
| Автор: azesmcar 23.6.2009, 12:56 | ||
| Killerman Перечитал все, так и не понял в чем проблема? Чем тебе не нравится STL? Не нравится интерфейс, стиль или названия функций, пиши свой адаптер. Хотя неправильно это. Я бы на твоем месте послушал этого совета
|
| Автор: Killerman 23.6.2009, 13:55 |
| xvr А вот этого (динамической памяти) в С++ (по сравнению с C#) должно быть гораздо меньше Тогда будет все нормально azesmcar Перечитал все, так и не понял в чем проблема? Чем тебе не нравится STL? Ну я в принципе согласен, что динамической памяти надо бы по меньше. Но мне кажется это самообман. Ведь даже те же списки последовательностей (list, vector, deque, ) а также map, set.... - это ни что иное, как динамическая память. У меня задача такая, использовать map map-ов, или map vector-ов, или vector vector-ов. Получается, я не могу динамически не выделять 2-й компонент, как к примеру: map<int,map<int,string>> mapofmap; Конечно можно было бы оставить так, но в таком случае при добавлении нового элемента в mapofmap все данные должны копироваться из вложенного map-а: map<int,string> m1; m1.insert(5, "ssss"); // так нельзя, но мне лень расписывать mapofmap.insert(7, m1); // НЕЯВНО выделяется динамическая память в mapofmap и идет копирование из m1 в элемент mapofmap Поэтому я использую map<int,map<int,string>*> mapofmap; Тогда получается ЯВНАЯ динамическая память. map<int,string>* m1 = new map<int,string>; mapofmap.insert(7, m1); // копируется только указатель. К тому же последний вариант иногда более предпочтителен, чтобы не множить одни и те же данные. Если можно сделать проще, скажите как. |
| Автор: azesmcar 23.6.2009, 14:01 | ||||||
можешь,
но я что-то плохо себе представляю ситуацию в которой такое может понадобиться. Добавлено через 1 минуту и 7 секунд
т.е. ты имеешь ввиду - чем больше динамически выделяемой памяти - тем хуже? Я ты попробуй несколько мегабайт в стеке выделить - тогда поговорим. и что значит ? |
| Автор: Lazin 23.6.2009, 14:15 | ||
| ты что, и на шарпе так пишешь? твой map map-ов и map vector-ов должны что-то означать, к примеру vector содержит список жильцов дома, а map - список домов, по их номерам, ну так кто тогда мешает написать
вместо того, что-бы городить такое: std::map< int, std::vector<std::string> >... и на шарпе это будет выглядеть не менее ужасно - Dictionary<int, List<String>> city; |
| Автор: Killerman 23.6.2009, 14:50 | ||
azesmcar
ну так я ж об этом написал. Но динамическая память всеравно выделятеся в mmap m, только она скрыта в реализации mmap (НЕЯНАЯ для пользователя). А ЯВНАЯ, это когда открыто создаешь объект через new. ну вектор векторов и меп мепов, или еще хуже мем мепов векторов часто нужно в задачах, к примеру синтаксического анализа, динамического построения таблиц, разпознавания и т.д. Короче нада мне А по поводу динамической памяти - я как раз за. Только вот сложно с ней в приложениях для win32. Если б как то увязать win32 обрабоку оконных месседжей и NET классы. Но это похоже нереально. |
| Автор: azesmcar 23.6.2009, 14:54 | ||
А мне надо миллион долларов и билет до Хельсинки.
Пиши на C# unmanaged code. |
| Автор: Killerman 23.6.2009, 15:15 | ||||||
Lazin
На шарпе оно токо в объявлении ужасно. А при работе потом очень даже.
Ну оно то да, но только красивая обертка. И классы создавать новые. Хотя. может. azesmcar
|
| Автор: azesmcar 23.6.2009, 15:17 | ||
http://www.codeproject.com/KB/cs/unmanage.aspx http://www.codeproject.com/KB/dotnet/managed_unmanaged.aspx |
| Автор: xvr 23.6.2009, 17:12 |
| В C++ динамическая память ГОРАЗДО хуже, чем в С# по той простой причине, что в C++ нет GC. Любая ошибка в new/delete приведет к утечке памяти или трудноуловимым ошибкам. В .net это проще - нужна память - выделил, не нужна - бросил как есть, система сама подберет В stl контейнерах с динамической памятью проще - там слежение за ней берет на себя библиотека (stl), а значит ошибится здесь гораздо сложнее (хотя при большом желании можно Если нужно работать с динамически создаваемыми контейнерами и/или объектами, можно применить boost::shared_ptr, но лучше проектировать систему так, что бы такой необходимости не возникало |
| Автор: Killerman 23.6.2009, 19:43 |
| а де это буст качнуть? и хелп на нево. |
| Автор: xvr 23.6.2009, 20:11 |
| www.boost.org Help на него в комплекте с ним |
| Автор: Killerman 24.6.2009, 08:56 |
| спасибо. Кстати с map<> как то можно узнать значение в ячейке, без проматывания всего списка через итераторы? ну там типа, какое значение в ячейке m[100]. |
| Автор: azesmcar 24.6.2009, 08:59 | ||||
|
| Автор: Killerman 24.6.2009, 09:17 |
| Такое я знаю. Хотелось ... = map[100] |
| Автор: azesmcar 24.6.2009, 09:20 |
Так тоже можно, но так неправильно. |