STLってなに

Last-modified: 2010-10-25 (月) 02:46:44

STLについて

本名 Standard Template Library であり,C++における標準ライブラリの一つ.[std]というものを君は見たことがあるか!?
 
超簡単用語解説

イテレータ : ポインタみたいなもの.厳密には違うが大体こんなものだと理解してね.
type : プログラム上で使ってますが,これを好きな型(int, double)に変えて使います

基本 (前座)

簡単に説明する.簡単に説明するので厳密には違う点もあるが,あくまでも簡単だ.

  • std::vector #include <vector>
    c言語における配列に近いもの.可変長の動的配列であり,なんやかんやで頼りになる奴.
    reference
    他サイト説明(割りと詳しめ)
    使用例
     std::vector<int>    x; //int型の大きさ0の配列
     std::vector<double> v(4); //double型の大きさ4の配列
     std::vector<double> v(4,0); // double型の大きさ4の配列で全てに0を格納
    
     v.push_back(100); //vの末尾の後ろに新しく値 100 を追加
              //v = { non, non, non, non, 100 } (non = 値なし)
     v.reserve(126);//領域を126分確保,ただし配列の幅は変わらない.
     v.resize(100);//配列の幅を100に変更
    
     v.size();//現在の配列幅の値を返す.
    
     v[num] = 100.; //num番目に100代入
     double value = v[num];//num番目の値を参照する
    
    基本的には初めにvectorの大きさを決めて使うか,push_backのメンバ関数で配列の後ろに値をどんどん足していく使い方が主になると思います.
     //push_backの動作を詳しめに
      std::vector<double> v;
      v.push_back(1);// v[0] = 1;
      v.push_back(2);// v[0] = 1; v[1] = 2;
      v.push_back(3);// v[0] = 1; v[1] = 2; v[2] = 3;
    
     
  • std::string #include <string>
    文字列の管理ならお手の物.もうchar*には帰れない.
    最大の特徴は演算子"+"が使えること. reference
      std::string str;
      str = "hoge" + "aho"; // str == "hogeaho"
      char* c = str.c_str(); // これでchar型の文字列を呼び出す.よく使う.
    
      std::cout << str << std::endl; //標準出力 -> 次で説明する
    
     
  • std::cout #include <iostream>
    cで言うprintfにあたる.細かい出力設定はprintfには劣るがc++の基本出力.[scanf]にあたる[std::cin]もある.
    特徴として出力の型を指定する必要がない.
    reference
    reference(English) <-一番詳しそうだったので
    http://www.sist.ac.jp/~suganuma/cpp/3-bu/16-sho/16-sho.htm  <--  memo
     std::cout << "hoge" << std::endl; // "hoge\n"と出力 std::endl は"\n"に当たる
     std::cout << "hoge\n";//これでも改行される
    
    //boostがあれば #include <boost/format.hpp>
     std::cout << "hoge " << boost::format("aho %d %lf") % num % value << std::endl;
     //printf風味を醸し出しつつ,coutを使える
     std::cerr << "hoge" << std::endl;// 標準エラー出力
     std::cin  >> value; // 入力
    

本番

参照 http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi

  • std::accumulate #include <numeric>
    vectorの中身の和を出す.
     std::vector<double> v(4);
     //vに値を詰める
     std::accumulate( v.begin(), v.end(), 0.0);
        // accumulate( 始めのイテレター, 最後のイテレーター, 初期値)
    
    これは色々改造で来たりしちゃいます.
  • std::sort #include <algorithm>
    vector内のソート( std::partial_sort 部分ソート )
     std::vector<int> data;
     //data入力
     std::sort( data.begin(), data.end());// 基本は昇順
     std::sort(data.begin(),data.end(),std::greater<int>());//降順ソート //#include <functional>
     std::sort(v.rbegin(), v.rend());//降順ソート
    
    と色々あります.もちろん"std::greater<int>()"の部分(比較関数)を自分で作ることも可能です.
    以下こんな感じ
     struct Sorter_less{
      bool operator()(const type& a, const type& b)const{
       return a<b;
      }
     };
    
     int hoge(){
      std::vector< type> v;
      //データ入力
      std::sort( v.begin(), v.end(), Sorter_less);
     }
    

memo

	struct UblasEigenVVSorter : std::binary_function
                                           <std::pair<double, ublas::vector<double> >,
                                            std::pair<double, ublas::vector<double> >,
                                            bool> {
		bool operator()(const std::pair<double, ublas::vector<double> >& lhs,
                                      std::pair<double, ublas::vector<double> >& rhs) {
			return lhs.first > rhs.first;
		}
	};

        std::vector<std::pair<double, ublas::vector<double> > > pairs;
		for (std::size_t i = 0; i < eigen.size(); ++i) {
			pairs.push_back(std::make_pair(eigen[i], eigenv[i]));
		}

		std::sort(pairs.begin(), pairs.end(), UblasEigenVVSorter());

関数アダプタ

理解したら書く
http://www.geocities.jp/ky_webid/cpp/library/025.html

std::binary_function
unary_function