C++ STLメモ1

C++には,STL(スタンダードテンプレートライブラリ)があるので,C言語だと苦労するデータ構造の管理を行わなくて済むため,メインのコーディングに注力できる。

具体的には,可変長配列,双方向連結リスト,連想配列などだ。

可変長配列 : vector と deque
文字列(可変長配列のひとつ) : string
双方向連結リスト : list
連想配列 : map

ほかにもいろいろあるが,ほとんど使わなくてもソフトウエア開発は十分にできる。
しかもSTLを使えば自分で苦労して作った可変長配列や連結リストよりも
効率がよい場合が多いし,自作よりもバグの混入率が下がる。

使い方は こんな感じ
#include <iostream>
#include <deque>

using namespace std;

int main(int , char** ) {
  deque<int> a;    // これで,aがint型の可変長配列
  a.push_back(10);    // これで要素数 1で 追加する値10
  a.push_back(3);    // これで要素数 2で 追加する値3
  int x = a[1] + 5;    // 普通のint型の配列のようにアクセスできる
  cout << x << endl;

  a.resize(10);  // これで,要素数が10になる。

  cout << "要素サイズは: " << a.size() << endl;   // 要素数の表示

  return 0;
}

詳しい仕組みや 内部データ構造などは考えていると時間がかかるので,
とにかく使いたい場合はこれでOK


-- 拡張子.h がない#includeの指定 --始まり---
#include で, .h が付いていない。 .hpp とか .hxx とか .h++とかでも
よかったのかもしれないが,ファイル名の衝突を避けるために,拡張子なしで
新たに作ったらしい。
iostream.hとかstring.hとかは,標準化される前からあるので,互換性の問題も
あるため,拡張子をなしにしたそうです。
-- 拡張子.h がない#includeの指定 --終わり---




- using namespace std; について -- 始まり ---------
using namespace std; というのが出てきた。名前空間を標準でstdを使うことを指定するものだ。
名前空間とは,グローバルな関数やクラスに同じ名前の関数やクラスがあっても
名前の衝突が起こらないようにできるもの。たとえば,C言語では
printfという関数は,自分で別のものを作るのはよくない。printfは画面に文字列や数値を表示する
関数なので勝手にprintfを用意すると,不具合が起こる。つまり,
printfという名前の関数は用意してはならないのである。ところが
名前空間を使えばこれを用意することが可能となる。
グローバルの中にstdという名前空間を用意して,その中に
dequeとかstringといったクラスを定義している。こうすることで自分で勝手に
stringというクラスを用意しても,C++のSTLのstringクラスとは別物となる。
 この例では,stdという名前空間を標準で使いますよという定義となる。

名前空間の具体的なコードは以下の様になります。
namespace std {
class string { /*..クラスの内容*/ };
}

stdという名前空間を用意してその中にstringクラスを宣言しています。
こうすることで,このstringは名前空間stdに所属します。このクラスを使うには,
std::string str;
という風に頭に 名前空間名:: をつける必要があります。これを省略するには
using namespace std;
と書いてやります。これがあれば,
string str;
と書いてやることができます。つまり頭に何もつけないときは,
std::がついていると仮定します。グローバルのstringを使いたいなら
::string str;
とすればよいわけです。

---- using namespace std; について -- 終わり ---------


- iteratorについて ------------ 始まり --------

ただし,各要素のアクセスはポインタを使う代わりに iterator (イテレーター)というものを使う。
iteratorは,反復子というもので,使い方はポインタにそっくりである。
ポインタの使い方がよくわからなくても問題ない。

iteratorは,データ構造ごとに別々のものとなる。vectorのiteratorとdequeのiteratorは違うし
同じdequeでも intの可変長配列としてのdequeとdoubleの可変長配列としてのdequeは
異なる。また,mapのiteratorは,可変長配列のiteratorとは使い方が異なる。

可変長配列,文字列,連想配列は実際にはiteratorを使わなくても
ほとんどのコードが書けます。

- iteratorについて ------------ 終わり --------


この記事へのコメント

この記事へのトラックバック