Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: неповторные пАры в multimap  (Прочитано 13453 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 14-03-2013 16:32 » 

поскольку мультимап позволяет хранить повторные ключи (и это нужно) , то возникает ситуация с повторными пАрами (при повторной вставке одного и того же value_type) , то есть


Код:
0->0
0->7
1->2 //
1->2 //повтор!
2->7
8->9

есть ли штатный способ вставки, чтобы такая повторная пара не записалась, или же сначала нужно чистить контейнер от всех "1->2" , а только потом вставлять ?
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 14-03-2013 16:56 » 

Проверку делай. Либо сделай каскад из map — этакий двумерный ассоциативный массив.
Еще можно включить значение в состав ключа:

Код: (C++)
typedef struct _mykey {
    int a;
    int b;
    _mykey(a, b) {
        this->a = a;
        this->b = b;
    }
} mykey;

typedef std::map<mykey, int> myasoc;

myasoc a;
a[mykey(0, 0)] = 0;
a[mykey(0, 1)] = 1;
a[mykey(0, 1)] = 1; // затираем старое
« Последнее редактирование: 14-03-2013 17:02 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 14-03-2013 17:00 » 

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

насчёт каскада - не понял. Я тогда в нём потом замучаюсь значение по ключу искать , лучше уж первый вариант

Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 14-03-2013 17:02 » 

Выше еще вариант.
Правда в таком случае затруднительно получить список значений по первому параметру.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 14-03-2013 17:06 » new

>>включить значение в состав ключа

тут тоже не очень удобно - ведь придётся определить оператор <, который в сравнении будет рассматривать только (a) - ведь по нему должна быть сортировка. Поэтому, поиск придётся производить тупо циклом, а не штатным методом find

Добавлено через 1 минуту и 13 секунд:
ну тут, в общем, понятно, что перед вставкой нужно проверку сделать. Просто я думал, что есть уже такой волшебный insert Улыбаюсь
« Последнее редактирование: 14-03-2013 17:07 от Алексей1153 » Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 14-03-2013 17:11 » 

насчёт каскада - не понял. Я тогда в нём потом замучаюсь значение по ключу искать , лучше уж первый вариант

Код: (C++)
typedef std::map<int, int> mapIntInt;
typedef std::map<int, myarr> mapIntIntInt;

mapIntIntInt a;
a[0][0] = 0;
a[0][1] = 1;
a[0][1] = 1; // перезапись

// a[0] дает mapIntInt с ключами 0 и 1



Добавлено через 2 минуты и 3 секунды:
ну тут, в общем, понятно, что перед вставкой нужно проверку сделать. Просто я думал, что есть уже такой волшебный insert Улыбаюсь

multimap<a,b> эквивалентен map<a, list<b>>.
« Последнее редактирование: 14-03-2013 17:15 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 14-03-2013 17:22 » 

Ром, а смотри

в мультимапе ключ можно и нужно повторять. Мне нужна неповторность ПАРЫ

вот такой вариант набора валиден для меня:

Код:
std::multimap<0,0>
std::multimap<0,7>
std::multimap<1,2>
std::multimap<2,7>
std::multimap<2,9>

а с твоим вариантом

1)
Код:
std::map<0, std::map<0,0 >> //затрётся 
std::map<0, std::map<0,7 >>
std::map<1, std::map<1,2 >>
std::map<2, std::map<2,7 >> //затрётся
std::map<2, std::map<2,9 >>

2)
Код:
map<0, list<0>> //затрётся 
map<0, list<7>>
map<1, list<2>>
map<2, list<7>> //затрётся
map<2, list<9>>
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 14-03-2013 17:27 » 

Как-то ты странно пишешь...

Код: (C++)
std::map<int, std::map<int, int>> a;

a[0][0] = 0;
a[0][0] = 0;
a[0][1] = 1;

Соседи друг другу не мешают. Дублирующих пар нет.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 14-03-2013 17:43 » 

всё, мыслю понял, спасибо )  Чот я затупил немного



* Безымянный.png (6.51 Кб - загружено 1478 раз.)
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 14-03-2013 17:47 » 

там даже с set лучше

Код:
	std::map<int, std::set<int> > a;

a[0].insert(0);
a[0].insert(7);
a[1].insert(2);
a[1].insert(2);
a[1].insert(2);
a[2].insert(7);
a[2].insert(9);

Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 14-03-2013 18:28 » 

Я как-то про set не вспомнил. Конечно, зачем лишний компонент.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines