コンテナクラスとテンプレート
例年より情報構造論が早く進んだので、STLとかBoostを少しだけ紹介するために、 その基本のコンテナとテンプレートを紹介する。
コンテナクラス
情報構造論の授業では、リストといった様々なアルゴリズムの説明では、 ひとまず整数でリストを…演習で名前と年齢の構造体で…といった 方式で進めてきたが、リストは次のデータのポインタと、実体のデータと考えれば、 実体データは、整数や名前と年齢といったように、必要に応じて変わってくる。
しかし、アルゴリズムが単純リスト・双方向リスト・2分木と変わっても、 実体データが違うだけで、自分自身で全てを記述することになる。 ただ、複雑なアルゴリズムになればなるほど、この作業が大変になる。
ここで、コンテナクラスという考え方が出てくる。 オブジェクト指向の派生・継承の考え方を使い、例えば単純リストを作りたい場合、 次のポインタだけの基本クラスを作り、そのリストを扱う処理をライブラリとして作っておく。 整数のリスト処理がしたければ、単純リストクラスに、整数を加えた派生クラスを作ったり、 名前と年齢を加えた派生クラスを作れば良い。
// 概念の説明用のクラス宣言であり、 // このままでは使いやすいクラスにはならない class List { private: List* next ; public: List( List* n ) : next( n ) {} } ; class ListInt : public List { private: int data ; : } ; class ListNameAge : public List { private: char name[20] ; int age ; : } ;
ただ、上記のプログラムでは、小さなオブジェクトでも仮想関数を使ったり、 肝心のアルゴリズムに相当する部分が記述が困難になるので、実際はもう少し 面倒な宣言になってしまう。 このため、C++などではテンプレートクラスがよく利用される。
テンプレート機能
C++でのテンプレート機能とは、型の部分を「仮の型名」としてプログラムを記述し、 そのプログラムを使用する時に具体的な型名を"<>"の中に記載する方式。 コンパイラ的には、異なる型でテンプレートが利用される度に、 その型用の機械語を生成するので、コードが肥大化する可能性があるのが問題ではある。
#include <stdio.h> template <class T> class List { public: T data ; List<T>* next ; public: List<T>( T x , List<T>*n ) : data( x ) , next( n ) {} } ; int main() { // 整数型のリスト処理 List<int>* p = new List<int>( 1 , new List<int>( 2 , NULL ) ) ; for( ; p != NULL ; p = p->next ) { printf( "%d\n" , p->data ) ; } // 実数型のリスト処理 List<double>* r = new List<double>( 1.2 , new List<double>( 2.3 , NULL ) ) ; for( ; r != NULL ; r = r->next ) { printf( "%f\n" , r->data ) ; } return 0 ; }
このテンプレートクラスの考え方を、究極まで活用したものとして、STL(Standard Template Library)や、 Boostといったライブラリが有名である。
// Cの場合 #include <stdio.h> int main() { int* a ; // 配列の作成 if ( (a = (int*)malloc( sizeof( int ) * 10 )) != NULL ) { // 配列の初期化 for( int i = 0 ; i < 10 ; i++ ) a[ i ] = i ; // 配列の合計 int sum = 0 ; for( int i = 0 ; i < 10 ; i++ ) sum += a[ i ] ; printf( "%d¥n" , sum ) ; } return 0 ; } // STLの場合 #include <numeric> #include <vector> #include <list> using namespace std ; int main() { vector<int> a ; // 配列サイズはSTL任せ... for( int i = 0 ; i < 10 ; i++ ) a.push_back( i ) ; // 配列末尾にiを追加 int sum = accumulate( a.begin() , a.end() , 0 ) ; printf( "%d¥n" , sum ) ; // 同じ処理を実数型の単純リストで... list<double> b ; for( int i = 0 ; i < 10 ; i++ ) b.push_back( (double)i ) ; printf( "%f¥n" , accumulate( b.begin() , b.end() , 0.0 ) ) ; return 0 ; }
F5クラスへの学科説明
工学基礎コースのF5クラスでは、2年進級時に転科を希望する学生さんもいることから、改めて学科の説明会が開催されました。
2014年1月26日(第357回)
- まるよし Train Pops ~ 国語と遊ぼう! 第40回 「高専入試の国語」
- 「オープニングトーク」の話
- 資格について
- 部活動の顧問の話
- 入試について
担当:前田勝(4EI)、山野(2C)、長水(教員)、五味(教員)
優秀学生表彰と学生総会
今日は、短縮授業としたなか、昼休み時間に、優秀学生表彰と学生が開かれました。
C++11を使う
情報構造論のシメとして、簡単なジェネリック型とかテンプレート型などを 紹介して終わろうかと、Boost や STL の資料を見ていて、C++を使っていても 解らない点がでてくる。 C++11あたりの新しい文法もからむので、改めて C++11の概要をWikipediaで見てみる。 なかなか、Boostなどのライブラリなどを的確に記述できるための文法なんだろうけど、 クラッシックなC++の理解に留まっていると (@_@) である。
興味深い文法があったので試すけど、動かないのであれ?っと思ったけど、 コマンドラインオプションで “-std=c++11″とか指定する必要があるのね。
void foo(int x) { std::cout << "foo(int)" << std::endl ; } void foo(char*p) { std::cout << "foo(char*)" << std::endl ; } int main() { foo(0) ; foo(NULL) ; // 曖昧だからコンパイルエラーだってさ。 foo(nullptr) ; // これが試してみたかった。 return 0 ; }
こういったC++11の文法を使いたかったら、
$ g++ -std=c++11 test.cxx
H26年度・春季・情報処理技術者試験の案内
H26年度春季・情報処理技術者試験の案内文書が届いております。
受付期間は、下記のようになっておりますので、 自分の学んできたことの実力を試し、 将来の就職試験でも学生時代の実力を見てもらうための手段として、 試験にチャレンジしてみましょう。
電子情報の学生さんであれば、基本情報や応用情報などの試験にチャレンジしてみましょう。
受付期間 | |
インターネット | 1/14(火)〜2/21(金)20時 |
郵便 | 1/14(火)〜2/10(月)消印有効 |
実施する試験区分 | |
基本情報、応用情報、プロジェクトマネージャ、データベース、 エンベデッドシステム、情報セキュリティ、システム監査 |
OS X Mavericks(10.9)の ntp 挙動

自宅 Windows7 の時計の自動同期がおかしくて、 設定を変更などをしていたけど、 ちゃんと動いているのか確認をしていたら、職場の Mac OS も 5分ずれている。
おかしい…と思い、"システム環境設定・日付と時刻"を表示させたら、 ずれていた時計が勝手に治っている。
改めて、NTPの設定を確認したら、このような記事を見つける。 日付と時刻を起動したら治るという点では同じ状況。
ということで、下記の設定を行い、再起動となった。
(( /etc/ntp.conf )) server 学内TimeServer minpoll 6 maxpoll 10 server ntp1.jst.mfeed.ad.jp minpoll 6 maxpoll 10 server time.asia.apple.com minpoll 6 maxpoll 10
2014年1月19日(第356回)
収録でお送りしました。
- 入試の話
- 到達度試験の話
- "先輩"が答える!~かかってこいや~
担当:中村(4EI)、牧田(4EI)、山野(2C)、松島(2C)
2次元グラフィックスの課題
前回の2次元座標の移動・回転・拡大などの説明を行ったので、 今回はその応用として、座標回転拡大の理解がわかるプログラム作成の課題に 取り組んでもらう。

一筆書きで簡単な家の絵を、(-50,-50)並行移動して、60度刻みで回転し、少しづつ倍率を増やしてみた。
構造体の関数渡しなどもわかってほしいので、 以下に示すようなコードとしてみた。 (ただしGrWinを使用)
- grsample.cpp (文字コードUTF-8)