Зачем существует std::multiset
От: Alexander G Украина  
Дата: 15.06.08 10:52
Оценка:
Кто-нибудь можеть привести пример разумного применения?
Русский военный корабль идёт ко дну!
Re: Зачем существует std::multiset
От: Vain Россия google.ru
Дата: 15.06.08 12:32
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Кто-нибудь можеть привести пример разумного применения?

имххо, set и multiset это примерно тожесамое что map и multimap, только без значений value.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: Зачем существует std::multiset
От: Alexander G Украина  
Дата: 15.06.08 12:50
Оценка:
Здравствуйте, Vain, Вы писали:

V>имххо, set и multiset это примерно тожесамое что map и multimap, только без значений value.


Для multimap вижу применение: привязывать к структурам числовые ключи и работать с диапазомами этих ключей методами lower_bound, upper_bound, equal_range. Просто связать ключи и значения — это скорее hash_map чем multimap.

Зачем может пригодиться multiset — не понимаю.
Русский военный корабль идёт ко дну!
Re[3]: Зачем существует std::multiset
От: Zigmar Израиль  
Дата: 15.06.08 15:14
Оценка:
Здравствуйте, Alexander G, Вы писали:
AG>Зачем может пригодиться multiset — не понимаю.

Задача: У Маши в корзине 4 яблока. Мама положила ей в корзинку еще 3 груши. Сколько фруктов в корзинке у Маши?
Решение:
enum Fruit{Apple, Pear, Kiwi};
struct Masha_t {
  std::multiset<Fruit> basket;
}Masha;

for(int i=0; i<4; ++i)
  Masha.basket.insert(Apple);

for(int i=0; i<3; ++i)
  Masha.basket.insert(Pear);

size_t answer = Masha.basket.size();

"To protect people you must slay people. To let people live you must let people die. This is the true teaching of the sword."
-Seijuro Hiko, "Rurouni Kensin"
Re: Зачем существует std::multiset
От: jazzer Россия Skype: enerjazzer
Дата: 15.06.08 15:43
Оценка: +1
Здравствуйте, Alexander G, Вы писали:

AG>Кто-нибудь можеть привести пример разумного применения?


это просто упорядоченная коллекция объектов с соответствующими гарантиями сложности вставки/удаления/поиска.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Зачем существует std::multiset
От: Roman Odaisky Украина  
Дата: 15.06.08 16:46
Оценка:
Здравствуйте, Zigmar, Вы писали:

Z>Задача: У Маши в корзине 4 яблока. Мама положила ей в корзинку еще 3 груши. Сколько фруктов в корзинке у Маши?


Здесь нужен std::map<Fruit, std::size_t>, а не multiset.
До последнего не верил в пирамиду Лебедева.
Re: Зачем существует std::multiset
От: R.K. Украина  
Дата: 15.06.08 17:01
Оценка: 2 (1)
Здравствуйте, Alexander G, Вы писали:

AG>Кто-нибудь можеть привести пример разумного применения?


Возможно, для хранения частично упорядоченного множества. Например:
struct stri_less
    : public std::binary_function<std::string, std::string, bool>
{
    bool operator()(const std::string &a, const std::string &b)
    { return _stricmp(a.c_str(), b.c_str()) < 0; }
};

std::multiset<std::string, stri_less> mset;
mset.insert("case");
mset.insert("Case");
mset.insert("caesar");
mset.insert("cASe");
mset.insert("CasE");
mset.insert("casual");

mset.equal_range("case"); // интервал со всеми видами "case"
You aren't expected to absorb this
Re[5]: Зачем существует std::multiset
От: Mazay Россия  
Дата: 15.06.08 17:12
Оценка: +1
Здравствуйте, Roman Odaisky, Вы писали:

Z>>Задача: У Маши в корзине 4 яблока. Мама положила ей в корзинку еще 3 груши. Сколько фруктов в корзинке у Маши?


RO>Здесь нужен std::map<Fruit, std::size_t>, а не multiset.


size() может иметь сложность O(1), а сумма по std::map<Fruit, std::size_t> — O(n)
Главное гармония ...
Re[2]: Зачем существует std::multiset
От: Alexander G Украина  
Дата: 15.06.08 17:45
Оценка:
Здравствуйте, R.K., Вы писали:

RK>Возможно, для хранения частично упорядоченного множества. Например:

RK>
RK>struct stri_less
RK>    : public std::binary_function<std::string, std::string, bool>
RK>{
RK>    bool operator()(const std::string &a, const std::string &b)
RK>    { return _stricmp(a.c_str(), b.c_str()) < 0; }
RK>};

RK>std::multiset<std::string, stri_less> mset;
RK>mset.insert("case");
RK>mset.insert("Case");
RK>mset.insert("caesar");
RK>mset.insert("cASe");
RK>mset.insert("CasE");
RK>mset.insert("casual");

RK>mset.equal_range("case"); // интервал со всеми видами "case"
RK>


Похоже, но
1. Не понимаю зачем такое может понадобиться.
2. Тут лучше подходит unordered_mulitset/hash_multiset, а не multiset.
Русский военный корабль идёт ко дну!
Re[4]: Зачем существует std::multiset
От: Alexander G Украина  
Дата: 15.06.08 17:57
Оценка:
Здравствуйте, Zigmar, Вы писали:

Z>Здравствуйте, Alexander G, Вы писали:

AG>>Зачем может пригодиться multiset — не понимаю.

Z>Задача: У Маши в корзине 4 яблока. Мама положила ей в корзинку еще 3 груши. Сколько фруктов в корзинке у Маши?

Z>Решение:

Не очень убедительно. Для данной задачи будет лучше vector. Для оптимальой работы при большом количестве фруктов и малом количестве типов фуктов — вариант Roman Odaisky. При большом числе типов фуктов — unordered_multiset.
Русский военный корабль идёт ко дну!
Re[5]: Зачем существует std::multiset
От: Zigmar Израиль  
Дата: 15.06.08 22:18
Оценка:
Здравствуйте, Alexander G, Вы писали:
Z>>Задача: У Маши в корзине 4 яблока. Мама положила ей в корзинку еще 3 груши. Сколько фруктов в корзинке у Маши?
Z>>Решение:
AG>Не очень убедительно. Для данной задачи будет лучше vector. Для оптимальой работы при большом количестве фруктов и малом количестве типов фуктов — вариант Roman Odaisky. При большом числе типов фуктов — unordered_multiset.
Эты была скорее шутка На практике, я не разу не сталкивался с задачей, где мне пришлось пользоваться multiset. Но мне кажется, что такие случае вполне могут быть, как пример выше, когда предикат сравнения не гарантирует тождественности самих объектов.
"To protect people you must slay people. To let people live you must let people die. This is the true teaching of the sword."
-Seijuro Hiko, "Rurouni Kensin"
Re[3]: Зачем существует std::multiset
От: jazzer Россия Skype: enerjazzer
Дата: 16.06.08 01:20
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, R.K., Вы писали:


RK>>Возможно, для хранения частично упорядоченного множества. Например:

AG>2. Тут лучше подходит unordered_mulitset/hash_multiset, а не multiset.
Интересно, как unordered_mulitset может подойти лучше в задаче, в которой требуется упорядочение.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: Зачем существует std::multiset
От: jazzer Россия Skype: enerjazzer
Дата: 16.06.08 01:22
Оценка:
Здравствуйте, Zigmar, Вы писали:

Z>Здравствуйте, Alexander G, Вы писали:

Z>>>Задача: У Маши в корзине 4 яблока. Мама положила ей в корзинку еще 3 груши. Сколько фруктов в корзинке у Маши?
Z>>>Решение:
AG>>Не очень убедительно. Для данной задачи будет лучше vector. Для оптимальой работы при большом количестве фруктов и малом количестве типов фуктов — вариант Roman Odaisky. При большом числе типов фуктов — unordered_multiset.
Z>Эты была скорее шутка На практике, я не разу не сталкивался с задачей, где мне пришлось пользоваться multiset. Но мне кажется, что такие случае вполне могут быть, как пример выше, когда предикат сравнения не гарантирует тождественности самих объектов.

Вообще-то предикаты, не гарантирующие тождественности, встречаются сплошь и рядом, а именно — когда ты упорядочиваешь структуры по одному полю и значения этого поля не являются уникальными (например, фамилия).
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Зачем существует std::multiset
От: Cyberax Марс  
Дата: 16.06.08 01:36
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Кто-нибудь можеть привести пример разумного применения?

Да запросто. Например, у тебя у человека есть набор отработаных смен, и нужно их распределить по датам. std::map<date, shift> не пойдёт, так как могут быть две (или три) смены в один день. Тут-то std::multimap/multiset и помогает.
Sapienti sat!
Re: Зачем существует std::multiset
От: igna Россия  
Дата: 16.06.08 05:07
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Кто-нибудь можеть привести пример разумного применения?


Словарь, где словарные статьи отсортированы по алфавиту, а синонимы не объединены в одной статье.
Re[4]: Зачем существует std::multiset
От: рыбак  
Дата: 16.06.08 07:53
Оценка: +1
Здравствуйте, Zigmar, Вы писали:

Z>Здравствуйте, Alexander G, Вы писали:

AG>>Зачем может пригодиться multiset — не понимаю.

Z>Задача: У Маши в корзине 4 яблока. Мама положила ей в корзинку еще 3 груши. Сколько фруктов в корзинке у Маши?

Z>Решение:
Z>
Z>enum Fruit{Apple, Pear, Kiwi};
Z>struct Masha_t {
Z>  std::multiset<Fruit> basket;
Z>}Masha;

Z>for(int i=0; i<4; ++i)
Z>  Masha.basket.insert(Apple);

Z>for(int i=0; i<3; ++i)
Z>  Masha.basket.insert(Pear);

Z>size_t answer = Masha.basket.size();
//  более убедительно:
  size_t nApples = Masha.basket.count(Apple);
Z>

Z>
Re: Зачем существует std::multiset
От: maq Россия http://www.maqdev.com
Дата: 16.06.08 08:26
Оценка: :)
AG>Кто-нибудь можеть привести пример разумного применения?

Пример: есть заказ и его составляющие, т.е. отношение один ко многим.

Можно хранить составляющие в multiset, причем ключем будет ссылка на заказ (ID заказа), тогда по ID заказа можно эффективно выбрать все его составляющие.
Re: Зачем существует std::multiset
От: sokel Россия  
Дата: 16.06.08 10:17
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Кто-нибудь можеть привести пример разумного применения?


например, над множеством объектов требуется построить различные индексы по каким любо ключам.
как вариант, индексы можно делать в виде set или multiset из указателей с соответсвующими компараторами — multisetset<T*, T_compare>
Re[4]: Зачем существует std::multiset
От: Alexander G Украина  
Дата: 16.06.08 13:26
Оценка:
Здравствуйте, jazzer, Вы писали:

RK>>>Возможно, для хранения частично упорядоченного множества. Например:

AG>>2. Тут лучше подходит unordered_mulitset/hash_multiset, а не multiset.
J>Интересно, как unordered_mulitset может подойти лучше в задаче, в которой требуется упорядочение.

Интересно как в случае multiset (не multimap) извлечь пользу из упорядочения.
Русский военный корабль идёт ко дну!
Re[2]: Зачем существует std::multiset
От: Alexander G Украина  
Дата: 16.06.08 13:29
Оценка:
Здравствуйте, maq, Вы писали:

maq>Пример: есть заказ и его составляющие, т.е. отношение один ко многим.


maq>Можно хранить составляющие в multiset, причем ключем будет ссылка на заказ (ID заказа), тогда по ID заказа можно эффективно выбрать все его составляющие.


Это multimap, а не multiset, причём скорее даже unordered_multimap
Русский военный корабль идёт ко дну!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.