最近更新したページ
2013-10-20
2013-09-29
2013-09-23
2012-01-07
2011-11-09
2011-10-23
2011-10-09
2011-10-01
2011-09-29
2011-09-03
2011-08-07
2011-08-02
2011-07-29
2011-07-10
2011-05-05
2011-05-04
2011-04-24
2011-04-13
2011-04-05
2011-03-26
2011-02-18
2011-02-15
2010-12-26
2010-12-07
2010-12-05
2010-11-23
2010-09-28
2010-09-23
2010-08-26
2010-08-22
2010-07-16
2010-01-17
2010-01-11
2009-10-04
2009-08-21
2009-08-13
2009-06-18
2009-06-01
2009-04-29
2009-02-16
2009-02-11
2009-02-03
2008-07-22
2008-07-21
2008-07-15
2008-07-14
2008-07-13
2008-07-12
2008-07-08
2008-07-05
2008-06-28
2008-06-17
2008-06-05
2008-06-02
2008-06-01
2008-05-29
2008-05-26
2008-05-21
2008-05-19
2008-05-18
2007-10-31
2007-10-27
2007-09-28
2007-09-23
2007-09-17
2007-09-16
2007-09-14
2007-09-11
2007-06-18
2007-04-15
2006-12-21
2006-11-30
2006-11-22
2006-08-17
2006-03-29
2006-03-28
2006-03-27

STL シーケンス(sample)


シーケンス(sample program)

 STL の基本データ構造(動的配列、リスト)を提供する。メンバ関数は一部異なる。
 vector(動的配列) deque list のサンプルコード、又は、利用上の注意点など。
 STL コンテナ頁より、分頁。(内容非保証)

list

 list は、データの追加削除に適した配列構造(データへのポインタを持つ配列)である。
 vector deque と大きく異なり ランダムアクセスが出来ない。

list sample

sample list
#include <iostream>
#include <list>
using namespace std;
void dsp_list(list<int> p) {
   printf("list element size:%2d array element=", p.size() );
   list<int>::iterator it = p.begin();
   for( ; it != p.end(); it ++) {
      printf(" %2d", *it );
   }
   cout << endl;
}
void main() {
   list<int> ary;
   ary.push_back(50); ary.push_front(5); ary.resize(6);
   dsp_list(ary);
   //
   ary.clear();  // list 配列の全クリア
   dsp_list(ary);

   ary.insert(ary.begin(), 3, 1);
   ary.insert(ary.end(),   2, 9);
   dsp_list(ary);

   list<int>::iterator it_b = ary.begin();
   list<int>::iterator it_e = ary.end();
   ary.insert(it_b, 8);
   ary.insert(it_e, 2);
   dsp_list(ary);

   list<int>::iterator it = it_b;
   it++;          // 何故か? ary.start() + 2 でエラー?※要チェック
   it++;
   ary.insert(it, 99);
   dsp_list(ary); // 配列の途中に追加可能

   it = ary.begin();
   it++;
   ary.erase(it);
   dsp_list(ary);

   ary.erase(ary.begin(), ary.end());
   dsp_list(ary);
}
※配列の途中で追加、削除が出来る。
※insert clear erase のメンバ関数も使用できる。

表示例
list element size: 6 array element=  5 50  0  0  0  0
list element size: 0 array element=
list element size: 5 array element=  1  1  1  9  9
list element size: 7 array element=  8  1  1  1  9  9  2
list element size: 8 array element=  8  1  1 99  1  9  9  2
list element size: 7 array element=  8  1 99  1  9  9  2
list element size: 0 array element=
続行するには何かキーを押してください . . .
※値 99 が、データの途中に追加された。
※clear erase の配列要素数処理は、コンパイラによって動作が異なるようなので注意。

▲上へ [ 編集 ]

deque

 はっきり言って vector と同じように使える。強力なのは、前方データ追加が可能な構造にある。
 詳細は、vector も参照のこと。

deque sample


sample deque
#include <iostream>
#include <deque>
using namespace std;
void dsp_deque(deque<int> p) {
   printf("size:%3d ary = ", p.size() );
   deque<int>::iterator it = p.begin();    // イテレータ
   for( ; it < p.end(); it++) {
      printf(" %2d ", *it );
   }
   cout << endl;
}
void main() {
   deque<int> ary;

   // deque へデータを追加する
   ary.push_back(20);  // 後方追加
   ary.push_back(10);
   dsp_deque(ary);     // 表示

   // deque 配列の前方にデータを追加する
   ary.push_front(5);  // 前方追加
   dsp_deque(ary);     // 表示

   // 要素数を意図的に確保する
   ary.resize(10);     // 要素数を10個へ拡大
   dsp_deque(ary);     // 表示
}
※vector との最大の違いは、前方へのデータ追加となると思われる。
※他は殆ど deque / vector に違いは無い?(...と思う...)
※イテレータでなくとも、普通にポインタ、配列なども使える(...はず...)

イテレータ利用のバリエーション
   ・・・
   deque<int>::iterator it;    // イテレータ
   for( it = p.start() ; it != p.end(); it++) {
      ・・・
   }
   ・・・
※通常 it != p.end() で判断させた方が確実らしい。

表示例
size:  2 ary =  20  10
size:  3 ary =   5  20  10
size: 10 ary =   5  20  10   0   0   0   0   0   0   0
続行するには何かキーを押してください . . .
※必要要素数を自動的に確保、また、意図的に予約しておくことも可能。
※前方追加が可能なことも大きな特徴。
※新しいデータを常に先頭へ挿入(追加)する場合、deque は強力。
※通常、一定サイズの円形配列とし、1データ追加で最後尾データが消滅するような使い方をする。

▲上へ [ 編集 ]

vector

 C/C++ の配列と基本的に互換有り。利用上の注意点のみ記載。

要注意点

 v は配列の先頭アドレスを持たない。v≠v[0] である。
int *p;
p = &(v[0]);   // 誤り例 p=v; p=&v v++; *v+3; 全部だめ!
printf("value  :%d ",  *(p+i)); // v.at( i ) or v[i] と同等
printf("address:%p \n",  p+i);  // &v[i] or &(v.at( i )) と同等
 ・・・ としてポインタを使用するのは問題がないようである。
※&(v.at( i )) でも配列先頭アドレスを返す。
※先頭アドレスをポインタへ代入すれば、以降ポインタによる配列処理は、C/C++ 同様に行える。
※但し、要素の追加・削除等で先頭アドレスが移動する場合があるので注意(例えて言えば「砂漠のオアシス」のように、以前あった場所にあるとは限らない。)
※これは、イテレータ利用でも近いところがあるが、ポインタ利用では拠り深刻と思われる。

▲上へ

vector sample

 宣言方法、要素サイズ取得の注意点など

vector:「動的な配列」の宣言
sample vector
#include <vector>
using namespace std;
〜
vector<char>   vc;        // char型   の動的配列を宣言
vector<int>    vi;        // int型    〃
vector<double> vd;        // double型 〃
vector<int>    via(256);  // 要素数を指定した配列宣言
int max_elements = 65536; // 要素数を変数で指定可能
vector<int>    vib(max_elements);
※配列宣言時に要素数指定無しでOK。要素数を指定する場合"()"を使用。
※配列要素数の指定に、変数を用いても特にエラーは出ないようである。

vector: 誤った使用例
※sizeof(vector) ---> これは期待値が返らない。
int size = sizeof(vi);
printf("sizeof(vi)              = %d \n",size); // 20 :使用メモリ
size = sizeof(vi) / sizeof(vi[0];
printf("sizeof(vi)/sizeof(vi[0] = %d \n",size); // 5  :要素数
※要素数を指定しない場合でも、取り合えず5つ要素を確保しているのがわかる。
※訂正:上記数値は誤り。vi.size() を取ると全く異なる値が返る。sizeof() では期待値が帰らないので通常配列と完全互換とは行かないようである。

vector:正しい使用例
※vi.size() ---> メンバ関数を使うのが正しい。
printf("vi.size():%d \n",  vi.size());     // 代入が無いので 要素数 0
vi.push_back( x );                         // 値を代入すると...
printf("vi.size():%d \n",  vi.size());     // 1 個要素が追加される
printf("vib.size():%d \n". vib.size());    // 65536

 他、C/C++ の配列と同様に扱い可能と思われるので、詳細サンプル割愛。

▲上へ

リンク


内部リンク


外部リンク


  • 現在ありません

▲上へ
2008年07月14日(月) 17:39:50 Modified by cafeboy1




スマートフォン版で見る