Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SWITCH, паттерн, реализация, одна загвоздка 
:(
    Опции темы
np9mi7
  Дата 1.4.2005, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



Добрый день Столкнулся с такой проблемой, хочеться реализовать паттерн switch.

Задача такова:
у меня есть некоторый набор объектов определенного типа. У каждого объекта есть свой уникалиный id, тоже определенного типа. Хочеться чтоб по предъявлению этого идентификатора мне возвращалась ссылка на объект который соотв. этому идентификатору. причем поиск должен осущ. за 1 шаг, те я по адресу в векторе должен стукануться.
Как это сделать? Совершенно не хочеться бегать по вектору в поисках нужного объекта. Вот примерный шаблон.

Код

template <class TYPE, class ID> class Switch
{
    std::vector<TYPE*> m_vcCollection;
//-----------------------------------------
    public:
        Switch    (const std::vector<TYPE*>&);
        Switch    ();
//-----------------------------------------        
        T&    GET    (const ID&);
};


Таким образом, получается касяк в обращении за один шаг к нужному объекту.

Это сообщение отредактировал(а) np9mi7 - 1.4.2005, 23:19


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Fire-Plug
Дата 1.4.2005, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: -1
Всего: 0



Здесь не паттерн нужен, a std::map<ID, Type>
ID - тип идентификатора твоего обьекта;
Type - это тип ссылки или указателя(выбор твой) на твой обьект.

Как получить обьект из map:
Код

typedef std::map<ID, Type> TMyObjMap;

TMyObjMap myObjMap; // как-то инициализирована

ID id= ....;
TMyObjMap::const_iterator it= myObjMap.find(id);
if( it == myObjMap.end())
{
 // not found 
  return; // or do something
}
Type& obj= it->second;



--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
Fire-Plug
Дата 1.4.2005, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: -1
Всего: 0



Цитата(np9mi7 @ 1.4.2005, 15:15)
причем поиск должен осущ. за 1 шаг, те я по адресу в векторе должен стукануться.

std::map как пишут в руководствах реализует алгоритм двоичного поиска (т.к. элементы map отсортированы по первому аргументу-ключу).
Поэтому число итераций поиска oпрeдeляется зависимостью:

log 2 (N), N - к-во элементов.

Поиск за один шаг осущ. так наз. совершенный хэш (perfect hash).
Но я этим не занимался. Мне достаточно STL.
--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
np9mi7
Дата 1.4.2005, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



Fire-Plug smile

perfect hash, а что это такое? Можешь дать ссылку?

Может у кого другие предложения??? smile

По сути, ты предложил поиск, а я тебе про поиск в один шаг.




--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Fire-Plug
Дата 1.4.2005, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: -1
Всего: 0



Цитата(np9mi7 @ 1.4.2005, 19:15)
perfect hash, а что это такое? Можешь дать ссылку?

http://www.google.com/search?hl=en&q=perfe...G=Google+Search

Цитата(np9mi7 @ 1.4.2005, 19:15)
По сути, ты предложил поиск, а я тебе про поиск в один шаг

Я предложил весьма практичное решение на основе STL, к-рое будет приемлемо в 95% прикладных задач.
Число итераций метода двоичного поиска:
Для контейнера из 10-ти элементов - 3
- " - из 100 элементов - 7 (2^7 = 128)
- " - из 1000 элементов - 10 (2^10 = 1024) и т.д.

Простейший (и тупейший) хэш - обычный массив.
Или можно с тем же успехом и по тому же принципу юзать vector.
Код

T* array[MAXOBJECTS]; // инициализирован 0

void SetObject(T* obj, size_t Id) // Id < MAXOBJECTS
{
    array[Id]= obj;
}

T* GetObject(size_t Id) // Id < MAXOBJECTS
{
    return array[Id];
}


--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
np9mi7
Дата 1.4.2005, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



Fire-Plug, ты как обычно пытаешся доказать что ты сто процентов прав! да ты прав! только, можно чуть лучше, согласись.... Гуглом я тоже пользоватьеся умею.... Только хотелось получить источник их которого ты это узнал, поэтому и спросил....

Понимаешь, мне нужен доступ за один шаг! Понимаешь? Поэтому и спросил, так сказать это в условии задачи обозначено...

За perfect hash спасибо, но про ln предлагаю больше не офтоппить.... ок?


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
bel_nikita
Дата 1.4.2005, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Цитата
Понимаешь, мне нужен доступ за один шаг! Понимаешь?

Цитата
У каждого объекта есть свой уникалиный id, тоже определенного типа.

что представляет из себя уникальный id?
Если Id - это обычный enum, то пихай все в array[MAX_ENUM];


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
yaja
Дата 1.4.2005, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нужны ссылки??
http://algolist.manual.ru/ds/s_has.php

или можешь почитать в любой книжке по алгоритмам ))
PM MAIL   Вверх
Fire-Plug
Дата 1.4.2005, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: -1
Всего: 0



Цитата(np9mi7 @ 1.4.2005, 15:15)
Хочеться чтоб по предъявлению этого идентификатора мне возвращалась ссылка на объект

Цитата(np9mi7 @ 1.4.2005, 21:13)
Понимаешь, мне нужен доступ за один шаг! Понимаешь?


Нет, не понимаю. Потому, что "Хочеться" вместо обоснования, почему никакие другие решения принципиально не подходят.
Если вопрос этот в плане учебы, повышения проф.уровня и т.д. и т.п., об этом прямо и честно надо заявить! Тогда будет смысл искать требуемое решение.
А если "Хочеться", то когда сроки прижмут фигней заниматься, то сразу перехочется.
Цитата(np9mi7 @ 1.4.2005, 21:13)
получить источник их которого ты это узнал

Источник - один крутой мэн, с к-рым у меня когда-то было интервью, в т.ч. по методам поиска. Он и рассказал, что есть такой perfect hash, но делать не заставлял - std::map катила...
Добавлено @ 21:59
Цитата(np9mi7 @ 1.4.2005, 21:13)
но про ln предлагаю больше не офтоппить

ln - ? Это что?
--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
np9mi7
Дата 1.4.2005, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



Цитата
что представляет из себя уникальный id?
Если Id - это обычный enum, то пихай все в array[MAX_ENUM];
, уникальный ID есть некое свойство для объекта, причем оно это свойство однозначно опр. этот объект. Типа как первичный ключ.

Ну да, при такой постановке задачи без поиска никак...

Цитата
Если вопрос этот в плане учебы, повышения проф.уровня и т.д. и т.п., об этом прямо и честно надо заявить! Тогда будет смысл искать требуемое решение.
, ну да...


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
chipset
Дата 2.4.2005, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Я никогда раньше не знал про perfect hash, но как я подумалл, можно добиться скорости в один шаг, только помещая в ключ указатель на адрес памяти где находится соответствующий этому ключу обьект.
Тогда не нужно будет поиска, программа просто читает по адресу.

Это сообщение отредактировал(а) chipset - 2.4.2005, 01:36


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Fire-Plug
Дата 2.4.2005, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: -1
Всего: 0



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

--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
chipset
Дата 2.4.2005, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Цитата(Fire @ 1.4.2005, 23:16)
Похоже, что тогда возникнет ситуация, что искать придется объект самого ключа, т.к. он перестанет быть примитивным типом, значение к-рого произвольно выбирается из нек-рого множества допустимых значений и его самого надо где-то хранить.

Что значит примитивный ключ? Какое может быть множество допустимых значений у сложного класса?
Я и хочу то всего лишь сделать базовый класс hash_object с указателем на область void, который задействуется лишь когда он будет учтен в базе map и в этот указатель будет записан указатель на соответствующий обьект.
Будет один шаг, но требование все-таки придется ввести для паттерна.

Это сообщение отредактировал(а) chipset - 2.4.2005, 10:27


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
np9mi7
Дата 3.4.2005, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



Всем спасибо за советы, топик закрыт. Немного не правильная постановка задачи, мной недопонятая.


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
chipset
Дата 3.4.2005, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Всё догнал, моё предложение не будет работать в большинстве случаев потому что значение ключа не хранит в себе указатель.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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