Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > std::map размерность и алгоритмы


Автор: Dimonius 17.2.2008, 16:27
Приветствую всех,
Недавно получил вопрос, на который я до сих пор не знаю ответ, вот решил у вас спросить. Второй вопрос возник у меня в процессе работы. Помогите пожалуйста разобраться.
  •  Что произойдет при попытке добавить новый элемент в map, когда у нас нет больше ресурсов (скажем память заполнена)?
  •  Будет ли работать алгоритм find_if для map, если я храню указатели как значение карты? (Пример ниже)

Пример для второго вопроса:
Код

class MyClass {
//скажем простой класс
};

int main() {
     MyClass* p;
     std::map<int, MyClass*> m;
     for (int i=0; i<10; i++) {
          p = new MyClass();
          m[i] = p;
     }
     //возможно ли выполнить алгоритм find_if, если да, то как?
     std::map<int, MyClass*>::iterator i = find_if(m.begin(), m.end(), ???);

     for (int i=0; i<10; i++) {
          p = m[i];
          delete p;
     }

     return 0;
}

Автор: maxdiver 17.2.2008, 18:19
1) будет сгенерировано исключение bad_alloc;
2) при такой организации данных функция find будет сравнивать не объекты, а указатели, что вероятно не то, что нужно.
функции find_if же можно просто передать указатель на нашу функцию сравнения, например, такую:
bool MyClass_ptr_eq (const pair<int,const MyClass*> & a)
{
   return *a.second == some_value;
}
ну а дальше уже, если такая функция не нравится, можно заюзать шаблоны.

Автор: Alek86 18.2.2008, 11:29
кстати, функтор (класс с перенгруженным оператором скобки) тут всегда лучше. писать не намного больше, а расширяемость и изменяемость почти бесконечная smile

Автор: Dimonius 18.2.2008, 17:19
maxdiver, спасибо - попробую, позже отпишусь о результатах

Цитата

кстати, функтор (класс с перенгруженным оператором скобки) тут всегда лучше. писать не намного больше, а расширяемость и изменяемость почти бесконечная smile

скиньте ссылочку на доку, где описано в чем преимущество функторов, если есть

Автор: Alek86 18.2.2008, 18:21
http://forum.vingrad.ru/faq/topic-157894.html

тут крайне кратко написано, ЧТО это.

а ЧЕМ ЭТО ЛУЧШЕ - уж поищи в инете

Добавлено через 1 минуту и 13 секунд
для затравки скажу, что функторы нужно знать и любить, без них в современном С++ обществе ну никак smile

Автор: Mayk 19.2.2008, 09:24
Цитата(maxdiver @  17.2.2008,  22:19 Найти цитируемый пост)
1) будет сгенерировано исключение bad_alloc;

или не будет. прога может запросто свалится с segfault'ом. смотреть например секцию bugs в http://linux.die.net/man/3/malloc и читать Саттера.

короче, в практических целях следует думать что new всегда завершается успешно.

Автор: Dimonius 19.2.2008, 13:02
Цитата(Mayk @  19.2.2008,  09:24 Найти цитируемый пост)
или не будет. прога может запросто свалится с segfault'ом. смотреть например секцию bugs в malloc(3) и читать Саттера.

короче, в практических целях следует думать что new всегда завершается успешно.


Неужели получается, что написать устойчивую к нехватке памяти прогу невозможно? То есть на самом деле зависит от того как ядро работает... Как же все таки быть?

Автор: Alek86 19.2.2008, 16:57
лови исключения операционной системы

Автор: Mayk 19.2.2008, 17:33
Цитата(Dimonius @  19.2.2008,  17:02 Найти цитируемый пост)
Неужели получается, что написать устойчивую к нехватке памяти прогу невозможно?

Если ты пишешь не для микроконтроллеров то толку от такой проверке будет почти что ноль. 
А вот код усложнится изрядно. В обычной жизни данные проверки не нужны ибо

Цитата(Alek86 @  19.2.2008,  20:57 Найти цитируемый пост)
лови исключения операционной системы 

емнип один из аргументов Саттера был в стиле "вы в любом случае не получите сообщение об ошибке: ибо из-за того что прога будет много свопится и тормозить всю систему до того как вся доступная память закончится, пользователь  её просто убьёт". Ещё один из аргументов был "ну поймали мы, а дальше что? вывести красивое сообщение об ошибке и умереть? но памяти то на красивое сообщение может просто и не хватить" .

ps. как жестокий эксперимнтатор хочу сказать что даже с отключенным свопом система [lnx] начинает ЖУТКО тормозить при заканчивании памяти что программу иной раз проще убить чем дождаться OOM Killer'а.

Автор: Dimonius 25.2.2008, 15:43
Цитата(Mayk @  19.2.2008,  09:24 Найти цитируемый пост)
читать Саттера

А какую именно книгу? У меня есть "Новые сложные задачи на C++". Она?

Автор: Alek86 25.2.2008, 15:49
все - там ОЧЕНЬ много полезного

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)