- ranges[meta header]
- concept[meta id-type]
- std::ranges[meta namespace]
- cpp26[meta cpp]
namespace std::ranges {
template<class T>
concept approximately_sized_range =
range<T> && requires(T& t) { ranges::reserve_hint(t); };
}approximately_sized_rangeは、要素数の近似値を償却定数時間で求めることができるRangeを表すコンセプトである。
sized_rangeが正確な要素数を要求するのに対し、approximately_sized_rangeは概算値で十分とする。Unicodeのケース変換や正規化など、出力サイズが入力サイズから厳密には計算できないが概算は可能な場面で、出力先コンテナのメモリ事前確保 (reserve()) に利用できる。
approximately_sized_rangeなRangeからはranges::reserve_hintで要素数の近似値を取得できる。
型がremove_reference_t<T>であるlvaluetについて、Tがapproximately_sized_rangeのモデルとなるのは、以下の条件をすべて満たす場合である:
ranges::reserve_hint(t)が償却定数時間で実行でき、tを変更せず、その値は0以上でrange_difference_t<T>で表現可能であることiterator_t<T>がforward_iteratorのモデルであれば、ranges::reserve_hint(t)はranges::begin(t)の評価によらず一意に定まること
sized_rangeはapproximately_sized_rangeを継承するため、sized_rangeであればapproximately_sized_rangeでもある。
#include <ranges>
#include <vector>
#include <forward_list>
int main()
{
// vectorはsized_rangeなのでapproximately_sized_range
static_assert(std::ranges::approximately_sized_range<std::vector<int>>);
// forward_listはsized_rangeではないがreserve_hintも提供しない
static_assert(!std::ranges::approximately_sized_range<std::forward_list<int>>);
}- std::ranges::approximately_sized_range[color ff0000]
- C++26
- Clang: 22 [mark noimpl]
- GCC: 16.1 [mark noimpl]
- Visual C++: 2026 Update 2 [mark noimpl]