std::map design: използвайте std::string за ключа на картата и името на съхранения обект (член)

Опитах се да намеря най-добрия начин за проектиране на хранилище на именувани обекти: std::map‹ std::string, NamedObject >

Бих искал да използвам std::map, където key е името на обекта. И от друга страна, бих искал моят обект да може да се идентифицира сам по себе си, като използвам метод getName() и връщам това име. Нещото, което ме дразни е, че не намерих по-добър начин освен да задам две копия на std::string, едно за ключа и едно вътре в обекта като член.

Ако някой има предложение?

РЕДАКТИРАНЕ:

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


person Sébastien Bémelmans    schedule 07.04.2016    source източник
comment
съжалявам, исках да кажа: boost multi_index_container ще позволи това, но това е допълнително усложнение, което може да не искате.   -  person Richard Hodges    schedule 07.04.2016
comment
да Търся решение, лесно за използване като std::map. Мисля да премахна името от обекта и да използвам итератора, за да го идентифицирам, но не ми харесва да използвам част от std::map на други места освен управлението на картата.   -  person Sébastien Bémelmans    schedule 07.04.2016
comment
да, това е ограничение на всички асоциативни контейнери в стандартната библиотека. Като каза това, повечето проблеми могат да бъдат изразени по отношение на наименуване и правене като отделни понятия, така че обикновено е уместно те да бъдат разделени.   -  person Richard Hodges    schedule 07.04.2016


Отговори (1)


Сигурни ли сте, че имате толкова високи изисквания към паметта? Ако да, мисля, че можете да създадете всяка функция "Hash" за името на обекта по следния начин:

int hash( const std::string& obj_name );

и след това използвайте

std::multimap<int, NamedObject>

но изглежда като допълнителна сложност

person Elena NNN    schedule 07.04.2016
comment
по този начин няма да запазите копие на името на обекта, но всеки път, когато трябва да извиквате хеш функция - person Elena NNN; 07.04.2016