C++11標準ライブラリで新しく追加されたstd::forward_listシーケンスコンテナは、要素数を返すsizeメンバ関数を提供しない。(空判定のemptyメンバ関数は提供される。)
#include <forward_list> std::forward_list<int> fl = /*...*/; size_t n = fl.size(); // NG: ill-formed // OK: 計算量O(n)で要素数を計算 #include <iterator> size_t n = std::distance(fl.begin(), fl.end());
C++11(N3337) 23.3.4.1/p2より該当箇所を引用。
A
forward_listsatisfies all of the requirements of a container (Table 96), except that thesize()member function is not provided. (snip)
forward_list導入の提案文書N2543では、“O(N) のsize実装” や “O(1) のsize実装” と比較したうえで、“sizeを提供しない” 設計を選択している。唯一sizeの計算量が線形時間 O(n) であったstd::listコンテナも、C++11標準ライブラリでは定数時間 O(1) 保証に変更されたことで、全ての標準コンテナでsize計算量が定数時間 O(1) となったことが背景にある。
関連URL