8

C ++標準ライブラリは、コンテナオブジェクトのインターフェイスを指定するために使用されるさまざまな「概念」を提供します。たとえば、、、、およびの概念 をstd::vector実装します。ContainerSequenceRandomAccessContainerReversibleContainer

C++03またはC++11で指定された、Sequence要素間の連続したメモリを保証するaを説明する概念はありますか?

static_cast<void*>(&some_sequence[N]) == static_cast<void*>(&some_sequence[0] + N)>

これは、コンテナを、などの連続したメモリバッファを期待する関数で使用できるかどうかを示すため、便利な概念ですstd::istream::read

std::vector実際には、 (そしてC ++ 11でのみ)実際に基になる連続バッファを保証するだけであることを私は知っています-しかし、この保証は、連続メモリを提供する汎用クラスを示す定義された「概念」にstd::string固有ですか、それともありますか?std::vectorSequence

4

3 に答える 3

3

C++17では「連続コンテナ」が規定されています。$23.2.1/13から一般的なコンテナー要件 [container.requirements.general] :

連続コンテナーは、ランダム アクセス反復子 ([random.access.iterators]) をサポートし、そのメンバー型 iterator および const_iterator が連続反復子 ([iterator.requirements.general]) であるコンテナーです。

そして、「連続イテレータ」については、$24.2.1/5 一般的に [iterator.requirements.general] :

整数値 n と逆参照可能な反復子値 a および (a + n) について、*(a + n) が *(addressof(*a) + n) と同等であるという要件をさらに満たす反復子は、連続反復子と呼ばれます。

std::vector ( を除くstd::vector<bool>)、std::arrayおよびstd::basic_stringは連続したコンテナーです。

于 2016-07-16T09:41:44.333 に答える
0

C ++ 03から、次のことのみstd::vectorを保証します(23.2.4.1):

ベクトルの要素は連続して格納されます。つまり、vがbool以外の型であるベクトルの場合、すべての0 <= n <vに対して&v [n] ==&v [0]+nのアイデンティティに従います。 。サイズ()。

C++11はstd::arrayを追加しました。これは、固定サイズの配列のラッパーであり、同じプロパティを持ちます。コンテナにそのような特性があるかどうかを知る方法はないと思います。

于 2013-03-19T20:59:15.603 に答える