Грабли: различия между версиями
Перейти к навигации
Перейти к поиску
Spiritum (обсуждение | вклад) Нет описания правки |
Ctrlalt (обсуждение | вклад) Нет описания правки |
||
Строка 51: | Строка 51: | ||
* [http://acm.timus.ru/help.aspx?topic=cpp Timus — Как писать решения на C/C++] (Раздел «Особенности компилятора по сравнению с другими 32-битными компиляторами C/C++») | * [http://acm.timus.ru/help.aspx?topic=cpp Timus — Как писать решения на C/C++] (Раздел «Особенности компилятора по сравнению с другими 32-битными компиляторами C/C++») | ||
== Приоритетная очередь работает быстрее, чем сет == | === Приоритетная очередь работает быстрее, чем сет === | ||
* Несмотря на равную асимптотику, приоритетная очередь имеет много меньшую константу, чем сет. Поэтому некоторые задачи можно сдать только с приоритетной очередью. | * Несмотря на равную асимптотику, приоритетная очередь имеет много меньшую константу, чем сет. Поэтому некоторые задачи можно сдать только с приоритетной очередью. | ||
=== Аккуратнее с map[key] = map.size() === | |||
* В результате при изначально пустом map значение map[key] может оказаться равным 1. Ситуацию вроде как исправили в C++17. | |||
* [http://blog.jayway.com/2015/09/08/undefined-behaviour-in-c-when-adding-to-map/ Unspecified behaviour in C++ when adding to map] |
Версия от 15:31, 17 мая 2019
Ввод и вывод
cin/cout работает медленнее scanf/printf
- Codeforces — Ввод/вывод в C++
- Codeforces — Снова про ввод/вывод в C++
- Habrahabr — Насколько медленны iostreams?
endl сбрасывает буфер вывода после перевода строки
Различные компиляторы по-разному округляют вещественные числа с последним дробным разрядом 5
Аккуратнее с %lld и %I64d: %lld предпочтительнее
- %lld некорректно работает в очень древних Visual C++, а также в GNU C++ (MinGW) под Windows XP (например, на acmp.ru).
- %I64d некорректно работает в GNU C++ под Linux (то есть почти везде).
- Codeforces: 1, 2
- CodeChef
Вещественные числа
Вещественные числа нужно использовать с осторожностью; функции <math.h> работают с вещественными числами
- ideone.com/yBUC04
- ideone.com/4wnPS0
- isocpp.org — Why doesn’t my floating-point comparison work?
- Макконнелл С. Совершенный код / С. Макконнелл. — М.: Русская редакция, 2010. — 896 с. — П. 12.3. «Числа с плавающей запятой», с. 286
- Codeforces — Weird bug with pow?
- Codeforces — Работа с вещественными числами
Если не хватает точности double
- Меняем все double на long double;
- Меняем все вызовы cstdio (scanf/printf) на вызовы iostream (cin/cout);
- Добавляем l ко всем функциям cmath (sqrt -> sqrtl, atan2 -> atan2l);
- Сдаём под g++.
Особенности функций
Метод .size() у контейнеров STL возвращает беззнаковое число
В <ctype.h> функции классификации символов (такие как isupper()) могут возвращать не только 0 и 1
Разное
В <math.h> Visual C++ уже заняты глобальные имена j0, j1, jn, y0, y1, yn
- Timus — Как писать решения на C/C++ (Раздел «Особенности компилятора по сравнению с другими 32-битными компиляторами C/C++»)
Приоритетная очередь работает быстрее, чем сет
- Несмотря на равную асимптотику, приоритетная очередь имеет много меньшую константу, чем сет. Поэтому некоторые задачи можно сдать только с приоритетной очередью.
Аккуратнее с map[key] = map.size()
- В результате при изначально пустом map значение map[key] может оказаться равным 1. Ситуацию вроде как исправили в C++17.
- Unspecified behaviour in C++ when adding to map