
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.52] |
![]() |
|
Сообщ.
#1
,
|
|
|
struct asd1{
int a; int b; }; struct asd2{ int c; int d; }; typedef pair <asd1, asd2> asd1asd2; map <asd1, asd2> m1; map <asd1, asd2> :: iterator pIter; Как занести в map данные? |
Сообщ.
#2
,
|
|
|
map[key]=value;
|
Сообщ.
#3
,
|
|||
|
Все просто. Простейший пример - тебе нужно сделать записную книжку. Там у тебя с каждой фамилией ассоциируется некоторая структура данных, содержащая телефон, адрес и т. п. информацию. Так вот - фамилия - это ключ, а структура - значение:
|
Сообщ.
#4
,
|
|
|
Спасибо, но мне это было понятно. Мне интересно как организовать сложный ключ.
map[key]=value, если key типа struct asd1 { int a; int b; }; не работает |
Сообщ.
#5
,
|
|
|
Мне нужен ключ, содержащий 2 inta. На данный момент я просто сделал вложенный map.
struct EventInfo { char EventName[255]; char EventInstruction[1024]; unsigned int SymbolID; unsigned char EventGroupID; bool NeedFixedZone; }; typedef map <int, EventInfo> EventsInfoMap; EventsInfoMap EventsInfoTemp; EventsInfoMap::iterator EventsInfoTempIterator; typedef pair <int, EventInfo> ObjectEventsInfoPair; map <int, EventsInfoMap> Objects_Events; map <int, EventsInfoMap>::iterator Objects_EventsIterator; typedef pair <int, EventsInfoMap> Objects_EventsPair; |
Сообщ.
#6
,
|
|||
|
В этом случае для сложного ключа необходимо реализовать операцию less. Например, так:
|
Сообщ.
#7
,
|
|
|
И еще как я понял из того, что вы написали pair это лажа, можно без него заносить?
|
Сообщ.
#8
,
|
|
|
Спасибо за less огромное.
|
Сообщ.
#9
,
|
|||||||
|
Можно и без него. Но тот пример, который привел я, простейший. В личной практике я чаще использую такой вариант:
При таком способе вставки можно узнать - было ли уже значение с таким ключем в коллекции:
Поэтому утверждать, что пара - это "лажа" нельзя. |
Сообщ.
#10
,
|
|
|
CODE
bool less(const asd1& a1, const asd2& a2) { return a1.a < a2.a && a1.b < a2.b; } Мне такая возможность не нужна (ключи будут уникальные), но все равно интересно было узнать. Спасибо. |
Сообщ.
#11
,
|
|
|
Дело в другом. map упорядочивает хранимые значения по ключу (для оптимизации доступа к ним). Ключи считаются уникальными априори. По этому less нужна обязательно. Альтернативный вариант - использование hash_map. Там действительно нужна только операция равенства (equal). Но этот контейнер идет только в поставке STLPort'а.
|
Сообщ.
#12
,
|
|
|
class asd3
{ public: bool less(const asd1& a1, const asd1& a2) { return a1.a < a2.a && a1.b < a2.b; } }; map <asd1, asd2, asd3 > m1; asd1 f; asd2 h; m1[f]=h; Что-то не работает ![]() |
Сообщ.
#13
,
|
|
|
less должна быть глобальной функцией.
|
Сообщ.
#14
,
|
|
|
bool less(const asd1& a1, const asd1& a2)
{ return a1.a < a2.a && a1.b < a2.b; } map <asd1, asd2, less > m1; asd1 f; asd2 h; m1[f]=h; Тоже не работает И так пробовал map <asd1, asd2, less<asd1> > m1; |
Сообщ.
#15
,
|
|||
|
Извини, запутал я тебя. Вмето less тебе нужно определить оператор '<':
Ты его можешь определить и в виде внешней функции, и в виде member-function. |
Сообщ.
#16
,
|
|||
|
less писать совсем не обязательно. Можно обойтись оператором < в своей структуре.
|
Сообщ.
#17
,
|
|
|
Спасибо огромное, действительно очень нужно было. Надеюсь напишу свою первую сложную, но не корявую прогу. AlexSm отдельное спасибо за пример
|
Сообщ.
#18
,
|
|
|
Objects_Events[ObjectsEventsKey(ObjectID,EventID)] = info;
EventInfo a= Objects_Events[ObjectsEventsKey(ObjectID,EventID)]; Проблема с извлечением ![]() |
Сообщ.
#19
,
|
|
|
А в чем, собственно, заключается проблема?
|
Сообщ.
#20
,
|
|
|
Заношу в map нормально со сложным ключом.
А извлекается ерунда EventInfo a= Objects_Events[ObjectsEventsKey(ObjectID,EventID)]; EventInfo это структура value, ObjectsEventsKey(ObjectID,EventID)] - конструктор ключа |
Сообщ.
#21
,
|
|
|
А как выглядит класс EventInfo?
|
Сообщ.
#22
,
|
|
|
struct ObjectsEventsKey
{ int ObjectID; int EventID; ObjectsEventsKey( int a, int ![]() ![]() bool operator < ( const ObjectsEventsKey &c) const { if(ObjectID < c.ObjectID) return true; else if(ObjectID > c.ObjectID) return false; else if(EventID <= c.EventID) return true; else return false; } }; struct EventInfo { char EventName[255]; char EventInstruction[1024]; unsigned int SymbolID; unsigned char EventGroupID; bool NeedFixedZone; int FixedZone; }; |
Сообщ.
#23
,
|
|
|
map <ObjectsEventsKey, EventInfo> Objects_Events;
|
Сообщ.
#24
,
|
|
|
А посмотри, что тебе вернет операция find для твоего ключа? Если Objects_Events.end(), то проблемы с поиском ключа.
|
Сообщ.
#25
,
|
|
|
Да возвращает Objects_Events.end(), но я ведь только что его занес и size равен единице и внутри mapa данные сидят
|
Сообщ.
#26
,
|
|
|
Тогда попробуй добавить операцию сравнения ключей (оператор ==).
|
Сообщ.
#27
,
|
|
|
Причина была в некорректной функции переопределения оператора <. Я ее изменил по сравнению с написанной AlexSm
|
Сообщ.
#28
,
|
|
|
К сожалению еще остались неясные моменты. Функция find() выдает end() хотя элемент есть в mape и успешно читается через []. Когда извлекаю данные со сложный ключом (1,1), (1,2) find не выдает end(). А элементы c (2,1) (2,2) по find не находит.
|
Сообщ.
#29
,
|
|||
|
Применительно к написанному мной примеру...
Прекрасно находит элементы..... |
Сообщ.
#30
,
|
|
|
map< asd1, int > m;
m[ asd1( 1, 0)] = 1; m[ asd1( 1, 1)] = 0; m[ asd1( 1, 3)] = 2; m[ asd1( 1, 4)] = -1; m[ asd1( 2, 0)] = 1; int a; a=m[ asd1( 2, 0)]; if(m.find(asd1( 2, 0))==m.end()) printf("Error"); Выдает еrror, хотя элемент извлекается нормально |
Сообщ.
#31
,
|
|||
|
При таком обьявлении структуры:
У меня твой код работает, и не выдает "Error". |
Сообщ.
#32
,
|
|||||
|
Такой оператор< никуда не годиться. C помощью него например (2,1)<(1,2); (1,2)<(2,1). Обычно он выглядит так:
|
Сообщ.
#33
,
|
|
|
да...признаю! твой будет правильней! используемый мной работал только на положительных числах. А работал он только из-за специфики работы алгоритма сортировки map.
![]() |
Сообщ.
#34
,
|
|
|
Да я тоже дошел до такого <. Он должен быть обнозначным при перемене параметров местами.
Сообщения были разделены в тему "Помощь в курсовой" |