五流!!日曜プログラマーのつどい - コンテナ

コンテナのオブジェクトのコピー

 ・負荷の大きなコンテナのコピーに気をつける
   巨大なオブジェクトを扱う場合,負荷に気をつけるならばポインタのコンテナを作成することを考える.
   その際スマートポインタについて応用することが望ましい(boost等による)
 (TODO)・スライシングの問題背景を確認

範囲メンバ関数

[コンパイル,動作チェックなし]
単一要素メンバ関数より範囲メンバ関数をい用いる利点
・簡単に作成可能
・意図が明確になる
・パフォーマンスの向上

範囲生成

container::container( inputIterator begin, inputIterator end );
 std::vector<int> hoge( hoge.begin(), hoge.end());                  // hogeの全体
 std::vector<int> piyo( hoge.begin(), hoge.begin()+hoge.size()/2 ); // hogeの半分

範囲挿入

  • シーケンスコンテナ
void container::insert( iterator position, inputIterator begin, inputIterator end);
 int data[3] = {1,2,3};
 std::vector<int> v;
 v.insert( v.begin(), data, data+3); // output 1 ,2 ,3
  • 連想コンテナ
 連想コンテナの場合,自動にソートされるのでシーケンスコンテナより引数が減少する.
void container::insert( inputIterator begin, inputIterator end);
  std::set myset;
  int myints[]= {5,10,15};          // 10 already in set, not inserted
  myset.insert (myints,myints+3);   // output 5, 10 ,15

範囲消去

  • シーケンスコンテナ
interator container::erase( iterator begin, iterator end);
  • 連想コンテナ
void container::erase( iterator begin, iterater.end);
vectorとstringの不必要なメモリを減らす方法はswap技法を用いる.(eraseで削除してもメモリの解法は行われない)
範囲形式のeraseには慣用的用法(eraseとremoveを用いる)がある.

範囲代入

void container::assign( inputeIterator begin, inputIterator end);
 std::vector<int> v(3,4);
 std::vector<int> u;

 u.assign( v.begin(), v.end());