Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.189.32.162] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#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. |