• Что не так с работой unordered_map?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Дело в том, что контейнер, или умный указатель, в современном C++ может (и делает это) несколько раз сменить аллоцируемый тип шаблонного аллокатора. При этом, оригинальный аллокатор, переданный через конструктор контейнера, будет использован для конструирования нового аллокатора с новым типом. Это означает, что новый аллокатор конструируется не через конструктор копирования, а через конструктор преобразования.

    Если в шаблоне алокатора не описано правило смены аллоцируемого типа (A::template rebind<U>::other), по умолчанию при смене аллоцируемого типа будет заменен первый шаблонный параметр. Был у нас Alloc<Foo, ...>, станет Alloc<Bar, ...>.
    Это означает что для правильной передачи состояния аллокатора нужно предусмотреть конструктор преобразования из аллокатора от твоего шаблона, но с другим первым аргументом.

    Еще можно использовать Polymorphic Allocator, но для этого потребуется сменить стандарт на C++17.
    Эту стратегию не так просто описать, поэтому я прибегну к ссылкам на доклады по этой теме.

    CppCon 2017: Bob Steagall “How to Write a Custom A...
    051. Modern C++ Allocators – Руслан Арутюнян (Intel)
    Taming dynamic memory - An introduction to custom ...
    C++Now 2018: David Sankel “C++17's std::pmr Comes ...
    Это, конечно, далеко не всё на данную тему. Но цели выписывать все у меня и нет. Я привел ссылки, которым доверяю в плане чистоты информации.
    Советую просто пройтись по хабру и ytube поиском докладов и статей.

    Если сказать очень коротко, то полиморфный аллокатор позволяет создавать аллокаторы с состоянием и более удобным интерфейсом, но работа с такими аллокаторами будет сопряжена с некоторой стоимостью обращения к аллокатору. Стоимостью обращения к стандартному аллокатору, в этом плане, обычно можно пренебречь.

    Но если ты работаешь со стандартом до C++11, то у тебя аллокатор вообще не может иметь состояние.
    All custom allocators also must be stateless. (until C++11)
    Ответ написан
    Комментировать
  • Как get/post запросом получить динамически подгружаемую информацию со страницы?

    Заходишь в инструменты разработчика (f12) -> вкладка network.

    Когда вводишь номер группы и получаешь результат, во вкладке появляется запрос, в котором есть расписание.
    Запрос выглядит вот так:
    https://urfu.ru/api/schedule/groups/lessons/981082/20200409/

    Если сейчас посмотреть результат, то это расписание группы с номером 373205. Но как видно в запросе, данный номер не фигурирует. В нем есть какие-то два числа 981082 и 20200409. Осталось разобраться что это за числа.

    Опять смотрим вкладку network и видим, что при вводе в поле "номер группы" сайт отправляет запрос на сервер вида:
    https://urfu.ru/api/schedule/groups/suggest/?query=373205

    В поле query как раз указан номер нужной группы. В ответ на это, сервер отдает такой json объект:
    {"suggestions": [{"value": "373205", "data": 981082}]}

    В поле value указан номер группы, а вот в поле data указано как раз одно из чисел в первом запросе (981082). Назовем это число id группы.

    Теперь осталось понять, что за число 20200409. Но для этого вкладка network уже не нужна, ведь если приглядеться, то станет понятно, что это просто дата - 2020 04 09.

    И так, для того что бы получить расписание для группы с номером NUMBER нужно сделать следующие шаги:
    • Сделать запрос для получение id группы:
      https://urfu.ru/api/schedule/groups/suggest/?query=NUMBER


    • Сделать второй запрос уже для получения расписания:
      https://urfu.ru/api/schedule/groups/lessons/ID/ТЕКУЩАЯ_ДАТА/


    Ответ написан
    Комментировать
  • Вопрос о делегатах и рефлексии типов в C#. Как по делегату узнать, к какому полю объекта обращаются в теле делегата?

    @kttotto
    пофиг на чем писать
    Да, реально. Это работа с деревом выражения, как точка отсчета для тебя тут, больше примеров тут.
    Ответ написан
    Комментировать