Заголовки стандартной библиотеки C++ могут включать друг друга неуказанным образом, поэтому программисты, как правило, не должны зависеть от того, включает ли один заголовок другой. Однако в некоторых случаях заголовок гарантированно включает другой заголовок или делает доступными определенные функции, которые в противном случае потребовали бы включения другого заголовка. Что это за случаи?
Какие заголовки в стандартной библиотеке C++ гарантированно включают другой заголовок?
Ответы (2)
Этот ответ игнорирует заголовки C - как <meow.h>
, так и <cmeow>
. Из заголовков библиотеки С++ (все ссылки на N4659):
<initializer_list>
гарантированно будет включен:
<utility>
(§23.2.1 [utility.syn])<string>
(§24.3.1 [string.syn])<array>
(§26.3.2 [array.syn])<deque>
(§26.3.3 [deque.syn])<forward_list>
(§26.3.4 [forward_list.syn])<list>
(§26.3.5 [list.syn])<vector>
(§26.3.6 [vector.syn])<map>
(§26.4.2 [associative.map.syn] )<set>
(§26.4.3 [associative.set.syn] )<unordered_map>
(§26.5.2 [unord.map.syn] )<unordered_set>
(§26.5.3 [unord.set.syn] )<queue>
(§26.6.2 [queue.syn])<stack>
(§26.6.3 [stack.syn])<algorithm>
(§28.2 [algorithms.syn])<random>
(§29.6.2 [rand.synopsis])<valarray>
(§29.7.1 [valarray.syn])<regex>
(§31.4 [re.syn])
<iostream>
гарантированно включает <ios>
, <streambuf>
, <istream>
и <ostream>
(§30.4.1 [ iostream.syn]).
<ios>
гарантированно включает <iosfwd>
(§30.5.1 [ios.syn]).
<bitset>
гарантированно включает <string>
и <iosfwd>
(§23.9.1 [bitset.syn]< /а>).
Бесплатные шаблоны функций std::begin
, std::end
, версии C++14 c-
, r-
и cr-
, а также бесплатные шаблоны функций C++17 std::size
, std::empty
и std::data
номинально находятся в <iterator>
, но также доступны, если какой-либо из следующих заголовков включены: <array>
, <deque>
, <forward_list>
, <list>
, <map>
, <regex>
, <set>
, <string>
, <unordered_map>
, <unordered_set>
и <vector>
(§27.7 [iterator.range], §27.8 [iterator.container]).
Когда включен <string_view>
, функции *begin
и *end
, а также две общие перегрузки std::swap
, определенные в [utility.swap] (swap(T&, T&)
и swap(T (&a)[N], T (&b)[N])
) гарантированно доступны. size/empty/data
, однако, нет. (§24.4.1 [string.view.synop]) .
std::cbegin
и т. Д. В C ++ 11. Большая часть этого находится в синопсисе для соответствующих заголовков.
- person T.C.; 28.10.2014
Вот обязательные включения для C++20, взятые из N4860.
сравнение включено в:
- множество
- хроно
- сопрограмма
- дека
- файловая система
- список_вперед
- итератор
- список
- карта
- Память
- необязательный
- очередь
- диапазоны
- регулярное выражение
- задавать
- куча
- нить
- string_view
- системная ошибка
- нить
- кортеж
- указатель типа
- unordered_map
- unordered_set
- полезность
- вариант
- вектор
initializer_list включен в:
- алгоритм
- множество
- дека
- список_вперед
- список
- карта
- очередь
- случайный
- диапазоны
- регулярное выражение
- задавать
- куча
- нить
- нить
- unordered_map
- unordered_set
- полезность
- валаррай
- вектор
строка включена в:
- набор битов
iosfwd входит в состав:
- набор битов
- iOS
понятия входят в состав:
- итератор
итератор включен в:
- диапазоны
ios, streambuf, istream включены в:
- iostream
ostream входит в состав:
- iostream
- синхронизация
cinttypes входит в состав:
- cstdint
<vector>
, вам не нужно включать<initializer_list>
или<iterator>
, если вам просто нужноstd::begin
/std::end
. - person T.C.   schedule 29.10.2014