Подтвердить что ты не робот

Заголовок файла для пары stl

Я использую для написания кодов с использованием stl-пары без включения какого-либо определенного файла заголовка для использования пары. Но друг сегодня сказал мне, что я должен использовать заголовок утилиты всякий раз, когда я использую пару, иначе у меня будут проблемы с некоторыми компиляторами. Скажите, верно ли это. И какой смысл использовать заголовок утилиты, если я могу писать коды, не используя его.

4b9b3361

Ответ 1

Вы должны почти всегда включать заголовочный файл для каждого класса, который вы используете в своей программе, иначе вы будете зависеть от того, что некоторые заголовки внутренне используют класс, представляющий интерес, но это может измениться на другом компиляторе или версии. Вам нужно прочитать ссылку на класс (например, на cppreference.com - http://en.cppreference.com/w/cpp/utility/pair) и проверить, какой файл заголовка вам нужно включить - в случае std::pair следует добавить #include <utility>. Вы не можете зависеть от того, что, например, iostream уже включает iomanip, и ваш код компилируется, когда вы используете манипуляторы типа setw и т.д. Вы не можете - вы всегда должны ссылаться на спецификации языка и включать требуемые заголовки.

Ответ 2

Дело в том, что вы, возможно, косвенно включили заголовок <utility> через включение какого-либо другого заголовка. Обычно это то, что заголовки включаются другими заголовками в реализацию на С++, без того, чтобы включение было санкционировано стандартом. Таким образом, включив <utility>, вы убедитесь, что ваш код переносится в соответствии со стандартными реализациями (по крайней мере, в отношении этой конкретной проблемы).

Стандарт указывает, что std::pair находится в <utility>, поэтому вы должны включать это, когда используете std::pair.

Ответ 3

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

Шаблон класса std::pair предоставляется <utility>.