汎用容器1


1.コンテナは、他のオブジェクトを持つオブジェクトを記述する.
2,c++処理容器はテンプレートに基づく方式を採用する.
3、vectorの効率的なアクセス要素、listの効率的な挿入など、異なる種類の容器が必要である.
4、容器保有対象の要求:(1)コピー可能;(2)付与可能である.
5,コンテナとコンテナの違い:(1)メモリにオブジェクトを格納する方法;(2)ユーザにどのような操作を与えるか.
6、容器分類まとめ:
(1)シーケンスコンテナ(vector,list,dequeue):要素を線形に組織する.
(2)コンテナアダプタ(queue,stack,priority_queue):シーケンスに特殊な属性を付加する.
(3)関連コンテナ(map,set,multiset,multimap):キーワードでデータを整理し、迅速なアクセスを許可する.
7.容器がconst容器である場合、begin()およびend()はconst反復器を生成する.
すなわち、これらの反復器が指す要素を変更することは許されない.
8,可逆容器の反復器:rbegin(),rend().
インスタンスコード:(読み込まれたファイル、行を逆順序で出力)

#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
    ifstream in("main.cpp");
    string line;
    vector<string> lines;
    while(getline(in, line))
    lines.push_back(line);
    for(vector<string>::reverse_iterator r = lines.rbegin();r != lines.rend(); r++)
        cout << *r << endl;
    return 0;
}

9、異なるタイプの挿入器の使用.
インスタンスコード:

#include <iostream>
#include <vector>
#include <deque>
#include <list>
#include <iterator>
using namespace std;

int a[] = { 1, 3, 5, 7, 11, 13, 17, 19, 23 };

template<class T>
void frontInsertion(T& c)
{
    copy(a,a+sizeof(a)/sizeof(a[0]),front_inserter(c));
    copy(c.begin(),c.end(),ostream_iterator<typename T::value_type>(cout," "));
    cout<<endl;
}

template<class T>
void backInsertion(T& c)
{
    copy(a,a+sizeof(a)/sizeof(a[0]),back_inserter(c));
    copy(c.begin(),c.end(),ostream_iterator<typename T::value_type>(cout," "));
    cout<<endl;
}

template<class T>
void midInsertion(T& c)
{
    typename T::iterator it = c.begin();
    ++it; ++it; ++it;//        
    copy(a, a + sizeof(a)/sizeof(typename T::value_type),inserter(c, it));
    copy(c.begin(),c.end(),ostream_iterator<typename T::value_type>(cout," "));
    cout << endl;
}

int main()
{
    vector<int> vec;
    list<int> lst;
    deque<int> deq;

    frontInsertion(deq);
    frontInsertion(lst);

    deq.clear();
    lst.clear();
    backInsertion(vec);
    backInsertion(deq);
    backInsertion(lst);

    midInsertion(vec);
    midInsertion(deq);
    midInsertion(lst);
    return 0;
}

10.ストリーム・反復器とストリーム・バッファ反復器の使用を比較します.
インスタンスコード:

#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
using namespace std;

int main()
{
    ifstream in(__FILE__);

    // :        
    istreambuf_iterator<char> isb(in), end;
    ostreambuf_iterator<char> osb(cout);
    while(isb != end)
        *osb++ = *isb++; // Copy 'in' to cout
    cout << endl;

    //      ,        .
    ifstream in2(__FILE__);
    istream_iterator<char> is(in2), end2;
    ostream_iterator<char> os(cout);
    while(is != end2)
        *os++ = *is++;
    cout << endl;
}