Войти
ФлеймФорумПрограммирование

Задачки с собеседований! (3 стр)

Страницы: 1 2 3 4 511 Следующая »
#30
11:20, 20 авг. 2017

1 frag / 2 deaths
> А сравнение как делается?

Из http://www.gamedev.ru/flame/forum/?id=229070&page=2#m24

   // look-up of the value associated with key
    V const& operator[]( K const& key ) const {
        return ( --m_map.upper_bound(key) )->second;
    }

#31
11:25, 20 авг. 2017

dave
Не вкурил, зачем такая логика.

И как оператор < для интервалов сделан?

#32
11:30, 20 авг. 2017

1 frag / 2 deaths

Там нет оператора <. Берется upperbound по значению ключа, оно всегда возвращает следующий элемент если ключ элемента мапы равен key или кеy в промежутке между ним и следующим за ним.

#33
11:41, 20 авг. 2017

Т.е. значение ключа-интервала [а,b) хранится... по ключу a std::map!

#34
11:52, 20 авг. 2017

dave
> Там нет оператора <
А инсерт делается по чему?

dave
> Т.е. значение ключа-интервала [а,b) хранится... по ключу a std::map!
Я вообще перестал понимать, а суть-то в чём?

#35
11:57, 20 авг. 2017

1 frag / 2 deaths

Я тоже сначала хотел делать используя операторы <, когда увидел задание, но потом вовремя одумался посмотрев на их реализацию оператора [] в коде задания. Немного почитал о них я понял, что все получается гораздо элегантнее если использовать маповские upperbound и lowerbound. Конечно они наверняка используют эти операторы сравнения, но внутри.

#36
14:31, 20 авг. 2017

dave
1 frag / 2 deaths
Ну т. е. интервал это до следующего ключа?
[ map.begin(), std::next(map.begin()) )
и далее?

#37
14:38, 20 авг. 2017

FordPerfect

Ну можно и так сказать.

#38
14:48, 20 авг. 2017

Мне кажется я понимаю, почему моя функция не могла пройти тест если допустить, что сама вставка правильная. А это, я думаю, так оно и есть.
Я наверное упустил случай, когда вставляются полуотрезки следующие друг за другом с одинаковым значением. В этом случае они могут сливаться. Но это уже вопросы оптимизации наверное...

#39
15:22, 20 авг. 2017

dave

if (m_map.find(keyBegin) == m_map.end())
{
    m_map.insert(std::make_pair(keyBegin, val));
}
else
{
    m_map[keyBegin] = val;
}
Зачем if?
[] же сам внутри делает то же.

Вроде достаточно

+ Показать

#40
15:29, 20 авг. 2017

Наверно чётче

+ Показать

#41
15:33, 20 авг. 2017

ты привязываешься к уже существующим значениям. Это значит, что твои полуинтервалы выходят за пределы, а этого делать нельзя по условию. Ну и потом в начале, в коде конструктора, можно посмoтреть, что изначально в первый элемент вставляется пара (-МАХ, 0) или что-то там...

#42
15:35, 20 авг. 2017

FordPerfect
> [] же сам внутри делает то же.

Это да, можно было убрать условие.

#43
15:51, 20 авг. 2017

Блин, косячу.

+ Показать

Вроде ок.
>ты привязываешься к уже существующим значениям. Это значит что твои полуинтервалы выходят за пределы а этого делать нельзя по условию. Ну и потом в начале, в коде конструктора, можно посмoтреть, что изначально в первый элемент вставляется пара (-МАХ, 0) или что-то там... Твой код будет менять только эту пару.

#44
15:59, 20 авг. 2017

FordPerfect

Ну да, комактнее получилось.
Можешь попробовать написать на фирму, правда придется подтвердить что не делал тест раньше. )
Только сдается мне, что он не пройдет тестинг.
Может какая-то хрень там, на экстремальных границах , например на максимуме, когда нельзя вставлять keyEnd.

Страницы: 1 2 3 4 511 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.