Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> std::map размерность и алгоритмы, out of resources, find_if для указателей 
:(
    Опции темы
Dimonius
Дата 17.2.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 11.10.2006

Репутация: нет
Всего: 1



Приветствую всех,
Недавно получил вопрос, на который я до сих пор не знаю ответ, вот решил у вас спросить. Второй вопрос возник у меня в процессе работы. Помогите пожалуйста разобраться.
  •  Что произойдет при попытке добавить новый элемент в 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;
}

PM MAIL   Вверх
maxdiver
Дата 17.2.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: нет
Всего: 18



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

Это сообщение отредактировал(а) maxdiver - 17.2.2008, 18:24
PM MAIL WWW ICQ   Вверх
Alek86
Дата 18.2.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



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


--------------------
user posted image    user posted image
PM MAIL   Вверх
Dimonius
Дата 18.2.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 11.10.2006

Репутация: нет
Всего: 1



maxdiver, спасибо - попробую, позже отпишусь о результатах

Цитата

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

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

Это сообщение отредактировал(а) Dimonius - 18.2.2008, 17:27
PM MAIL   Вверх
Alek86
Дата 18.2.2008, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



http://forum.vingrad.ru/faq/topic-157894.html

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

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

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


--------------------
user posted image    user posted image
PM MAIL   Вверх
Mayk
Дата 19.2.2008, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



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

или не будет. прога может запросто свалится с segfault'ом. смотреть например секцию bugs в malloc(3) и читать Саттера.

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

Это сообщение отредактировал(а) Mayk - 19.2.2008, 09:24


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Dimonius
Дата 19.2.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 11.10.2006

Репутация: нет
Всего: 1



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

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


Неужели получается, что написать устойчивую к нехватке памяти прогу невозможно? То есть на самом деле зависит от того как ядро работает... Как же все таки быть?
PM MAIL   Вверх
Alek86
Дата 19.2.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



лови исключения операционной системы


--------------------
user posted image    user posted image
PM MAIL   Вверх
Mayk
Дата 19.2.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



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

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

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

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

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


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Dimonius
Дата 25.2.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 11.10.2006

Репутация: нет
Всего: 1



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

А какую именно книгу? У меня есть "Новые сложные задачи на C++". Она?
PM MAIL   Вверх
Alek86
Дата 25.2.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



все - там ОЧЕНЬ много полезного


--------------------
user posted image    user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1066 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.