Ranges от 29 юли изпитна задача
Искам да пусна тази тема, защото се опитах да реша тази задача.Избрах не особено ефективен метод, и judge дава 30/100 въпреки, че кода работи коректно. Помогна ми MarinBG. Той каза, че тази задача е една от агоритмичните задачи в този курс.(Fundamentals C++), ако искате се опитайте и вие. А тя сега е подходяща, за да упражните асоциативните контейнери.
std::ostream::sync_with_stdio(false);
std::istream::sync_with_stdio(false);
std::cin.tie(nullptr);
Може, ли да обясните горната част от код?
input.clear(); защо тябва да "чистим" потока, това по-ефективно ли е? И как се разбира,кога да го използваме?
input.str(line); с това се взима едим ред, така ли? Имаше и .get(за char), kolioi го беше използвал в задачата decomprres.
Тук има добро обяснение на I/O оптимизациите. От извора: sync_with_stdio, tie
Синхронизацията може да се изключи и директно през базовия (ios_base) клас:
Извиквам clear() метода върху стрийма за да изчистя всякакви грешки (error bits), ако има такива, останали от предишното му използване. В случая го правя превантивно, защото искам да преизползвам стрийма, вместо да създавам нов на всяка итерация. Ако създаваш нов стрийм това не е необходимо.
str(text) "зарежда" стрийма с ново съдържание.
Предполагам, питаш за следните варианти:
Както съм писал в коментарите в кода, първият вариант е общ (може да работи с различни колекции) и заради това може да е по-бавен, вместо специализирания, който е дефиниран за конкретната колекция. Дори и в случай на малки разлики в бързодействието, вторият вариант е за предпочитане, защото не се налага импортването на външна библиотека.
Относно оптимизациите за вход/изход - да, задачата работи и без тях, но ако погледнеш времената в Judge, ще забележиш, че без тях решението минава за 0.350 - 0.400 сек. и за около 0.115 сек., ако ги има.