Effective C+(8)シーケンスコンテナvector,list,deque
2942 ワード
コンテナタイプのオブジェクトを定義するには、まず関連するヘッダファイル、すなわち次のヘッダファイルのいずれかを含める必要があります.
#include <vector>
#include <list>
#include <deque>
すべてのコンテナはクラステンプレートです.特定のコンテナを定義するには、コンテナ名の後にカッコを付ける必要があります.カッコの中には、コンテナに格納されている要素のタイプがあります.
vector<string> svec; // empty vector that can hold strings
list<int> ilist; // empty list that can hold ints
deque<Sales_item> items; // empty deque that holds Sales_items
1つのコンテナを別のコンテナのコピーに初期化
デフォルトのコンストラクション関数ではなく、他のコンストラクション関数でシーケンスコンテナを初期化する場合は、コンテナにどれだけの要素があるかを指定し、これらの要素の初期値を指定する必要があります.要素の個数と初期値を同時に指定する方法の1つは、新しく作成したコンテナを同じタイプの既存のコンテナのコピーに初期化することです.
vector<int> ivec;
vector<int> ivec2(ivec); // ok: ivec is vector<int>
list<int> ilist(ivec); // error: ivec is not list<int>
vector<double> dvec(ivec); // error: ivec holds int not double
, 。
, 。 , ,
, 。
反復器は、新しいコンテナの要素を初期化するために使用されるコピーする要素の範囲をマークします.反復器は、コピーする最初の要素と最後の要素をマークします.この初期化形式では、直接コピーできないコンテナをコピーできます.さらに重要なのは、他のコンテナをコピーするサブシーケンスです.
// initialize slist with copy of each element of svec
list<string> slist(svec.begin(), svec.end());
// find midpoint in the vector
vector<string>::iterator mid = svec.begin() + svec.size()/2;
// initialize front with first half of svec: The elements up to but not including *mid
deque<string> front(svec.begin(), mid);
// initialize back with second half of svec: The elements *mid through end of svec
deque<string> back(mid, svec.end());
ポインタを振り返ると、ポインタが反復器であることがわかります.したがって、内蔵配列のポインタのペアを使用してコンテナを初期化できるのも不思議ではありません.
char *words[] = {"stately", "plump", "buck", "mulligan"};
// calculate how many elements in words
size_t words_size = sizeof(words)/sizeof(char *);
// use entire array to initialize words2
list<string> words2(words, words + words_size);
(1) , ( ) 。 ,
:
const list<int>::size_type list_size = 64;
list<string> slist(list_size, "eh?"); // 64 strings, each is eh?
(2) 。
:
レプリケーションと付与機能のサポートは、コンテナ要素タイプの最低限の要件です.さらに、一部のコンテナ操作は、要素タイプに特別な要件があります.要素タイプがこれらの特別な要件をサポートしていない場合、関連するコンテナ操作は実行できません.このタイプのコンテナを定義できますが、特定の操作は使用できません.