Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Классы hashtable, idictionary и другие для Win32, Классы hashtable, idictionary и другие 
:(
    Опции темы
Killerman
Дата 23.6.2009, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Кто знает, какие классы из STL или может каких то других библиотек есть для Win32 вместо .NET-ских Hastable, Dictionary и т.д.
классы map<> и set<> из STL не устраивают. И немного напрягает работа с итераторами. То, что для .NET-ских классов выглядит как простой вызов функции, для STL классов превращается в длинную писанину.


PM MAIL   Вверх
jonie
Дата 23.6.2009, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



STL для Win32 ?! это что-то новенькое.
http://www.cplusplus.com/reference/stl/
вот перечень контейнеров


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Rififi
Дата 23.6.2009, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



Killerman, 
какие классы из STL
без итераторов - никакие.

классы map<> и set<> из STL не устраивают.
тогда делать свои поделки
PM MAIL   Вверх
jonie
Дата 23.6.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



дак и в .net тоже итераторы есть (IEnumerable или IEnumerable<T> почти наследуются все коллекции тамошние)...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Rififi
Дата 23.6.2009, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



jonie, 
дак и в .net тоже итераторы есть 
т-с-с-с! а то спугнёшь smile
PM MAIL   Вверх
Killerman
Дата 23.6.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



jonie, 
дак и в .net тоже итераторы есть 

Есть, но их не нужно использовать явно. А класс hashtable я вообще не нашел для Win32.

Я просто подумал. может есть какая то дополнительная библиотека независимых разработчиков....

Это сообщение отредактировал(а) Killerman - 23.6.2009, 10:30
PM MAIL   Вверх
W4FhLF
Дата 23.6.2009, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Killerman, а чем конкретно стандартные map и set не устраивают?


Цитата(Killerman @  23.6.2009,  10:27 Найти цитируемый пост)
А класс hashtable я вообще не нашел для Win32.


boost::intrusive::hashtable

Цитата(Killerman @  23.6.2009,  10:27 Найти цитируемый пост)
Я просто подумал. может есть какая то дополнительная библиотека независимых разработчиков....


Boost.Intrusive


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Lazin
Дата 23.6.2009, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



Цитата(Killerman @  23.6.2009,  10:27 Найти цитируемый пост)
Есть, но их не нужно использовать явно

используй boost foreach, либо алгоритмы

Код

std::vector<int> values;

...

BOOST_FOREACH( int x , values )
{
    std::cout << x << std::endl;
}

...

struct print_int
{
void operator () (int i) { std::cout << i << std::endl; }
};

std::for_each(values.begin(), values.end(), print_int());

....

std::copy(values.begin(), values.end(), std::ostream_iterator<int>(std::cout));


Это сообщение отредактировал(а) Lazin - 23.6.2009, 10:59
PM MAIL Skype GTalk   Вверх
Killerman
Дата 23.6.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



W4FhLF
Killerman, а чем конкретно стандартные map и set не устраивают?

Ну тем, что все оно какое то роботское.
К примеру в map нельзя проверить, что елемент какой то не существует через:

map<int, char,ltd::less<int>> m1;

if(map[10] ==NULL) //error 

Через map[10] можно только изменить значение, но не вывести результат.
Получается мне нужно сначала создать итератор:
Код

map<int, char,ltd::less<int>>::const_iterotor iter1;

// потом произвести поиск

result = false;
for(iter = m1.begin(), iter!=m1.end(); ++ iter)
{
    if(iter->first ==10)
  {
        result = true;
        break;
    }

}

if(result == fasle)
{
  .............
}


Ну короче ясно о чем я.

Или еще такой прикол, к примеру мне нужно динамически создать список, ну вот так:

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 скачать?
PM MAIL   Вверх
W4FhLF
Дата 23.6.2009, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Цитата(Killerman @  23.6.2009,  11:25 Найти цитируемый пост)
Ну тем, что все оно какое то роботское.К примеру в map нельзя проверить, что елемент какой то не существует через:
map<int, char,ltd::less<int>> m1;if(map[10] ==NULL) //error 
Через map[10] можно только изменить значение, но не вывести результат.Получается мне нужно сначала создать итератор:


Код

    typedef std::map<int, std::string> StringTable;
    StringTable stable;

    stable[10] = "Ten";

    //StringTable::const_iterator it = stable.find(10);
    if(stable.find(10) != stable.end())
        std::cout << stable[10] << std::endl;


Добавлено через 1 минуту и 27 секунд
Цитата(Killerman @  23.6.2009,  11:25 Найти цитируемый пост)
(*s1)[10]; //выглядит не очень читабельно.


Код

s1->at(10);


Добавлено через 2 минуты и 37 секунд
Цитата(Killerman @  23.6.2009,  11:25 Найти цитируемый пост)
и такое:nd->SetAtributes("F1", new BitArray(*((BitArray*)nd->Childs()[0]->GetAtributes("F1"))));И иногда вспоминаешь С#, где просто обращаешся через всю иерархию классов через простую точку:с1.с2[i].c3.c4..................


А такие конструкции, как правило, связаны с ошибками архитектуры и проектирования. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Killerman
Дата 23.6.2009, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



C ->at(10) это да. Немного удобнее. Но по поводу архитектуры не согласен.
Просто если конструкция не очень сложная, то все рабоает неплохо. 
А когда задача усложняется, то Win32 начинает очень заметно проигрывать Net-у в читабельности и быстроте написания. Особенно заметно это для объектов с динамически-выделяемой памятью.
PM MAIL   Вверх
xvr
Дата 23.6.2009, 12:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(Killerman @ 23.6.2009,  12:22)
Просто если конструкция не очень сложная, то все рабоает неплохо. 

Оно и для сложных неплохо работает
Цитата

А когда задача усложняется, то Win32 начинает очень заметно проигрывать Net-у в читабельности и быстроте написания. 
А не надо на С++ писать как на С# - это разные языки, и подходы к проектированию программ на них тоже разные
Цитата

Особенно заметно это для объектов с динамически-выделяемой памятью.
А вот этого (динамической памяти) в С++ (по сравнению с C#) должно быть гораздо меньше
Тогда будет все нормально

PM MAIL   Вверх
azesmcar
Дата 23.6.2009, 12:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



Killerman

Перечитал все, так и не понял в чем проблема? Чем тебе не нравится STL? Не нравится интерфейс, стиль или названия функций, пиши свой адаптер. Хотя неправильно это. Я бы на твоем месте послушал этого совета
Цитата(xvr @  23.6.2009,  12:30 Найти цитируемый пост)
не надо на С++ писать как на С# - это разные языки, и подходы к проектированию программ на них тоже разные


PM   Вверх
Killerman
Дата 23.6.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



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); // копируется только указатель.

К тому же последний вариант иногда более предпочтителен, чтобы не множить одни и те же данные.

Если можно сделать проще, скажите как.





Это сообщение отредактировал(а) Killerman - 23.6.2009, 13:57
PM MAIL   Вверх
azesmcar
Дата 23.6.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



Цитата(Killerman @  23.6.2009,  13:55 Найти цитируемый пост)
У меня задача такая, использовать map map-ов, или map vector-ов, или vector vector-ов. Получается, я не могу динамически не выделять 2-й компонент, как к примеру:

можешь, 
Код

typedef std::map<int, std::map<int, int> > mmap;
mmap m;
m.insert( mmap::value_type(10, std::map<int, int>()) );

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

Добавлено через 1 минуту и 7 секунд
Цитата(Killerman @  23.6.2009,  13:55 Найти цитируемый пост)
Ну я в принципе согласен, что динамической памяти надо бы по меньше.

т.е. ты имеешь ввиду - чем больше динамически выделяемой памяти - тем хуже?
Я ты попробуй несколько мегабайт в стеке выделить - тогда поговорим. smile 

и что значит
Цитата(Killerman @  23.6.2009,  13:55 Найти цитируемый пост)
ЯВНАЯ динамическая память

?

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0821 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.