最終更新日時(UTC):
が更新

履歴 編集

concept
<ranges>

std::ranges::approximately_sized_range(C++26)

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について、Tapproximately_sized_rangeのモデルとなるのは、以下の条件をすべて満たす場合である:

  1. ranges::reserve_hint(t)が償却定数時間で実行でき、tを変更せず、その値は0以上でrange_difference_t<T>で表現可能であること
  2. iterator_t<T>forward_iteratorのモデルであれば、ranges::reserve_hint(t)ranges::begin(t)の評価によらず一意に定まること

備考

sized_rangeapproximately_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>>);
}

出力

バージョン

言語

  • C++26

処理系

関連項目

参照