Pages

2008年10月17日 星期五

C++ STL 容器的建(解)構

最近複習 STL,使用時發現一個現象,這邊我以 vector 為例來描述:
##ReadMore##
#include <iostream>
#include <vector>

using namespace std;

struct Foo {
    Foo() {
        cout << "Constructed" << endl;
    }

    ~Foo() {
        cout << "Destructed" << endl;
    }
};

int main() {
    vector<Foo> data(3);
    return 0;
}
跑出來的結果如下所示:
Constructed
Destructed
Destructed
Destructed
Destructed

從輸出的結果我們可以發現,vector的建構子會先建構出一個 FOO 類別的實體,接著再將內容複製三份至容器中,所以 vector data(3); 這一行敘述相當於 FOO foo; vector data(3,foo);。其實,C++ 容器都是以複製的方式來做建構,如:list、deque..,etc。不過搞不太懂是如何實作XD!有空再想想看好了。

2008年10月5日 星期日

如何讓束縛函式作用在自訂的函式物件中

束縛函式可以對雙元的函式物件作限制,共分為兩種:bind1st bind2nd。例如:
less<T>(a, b);      // 比較 a 是否比 b 小
bind1st(less<T>(), 50); // 限制 a 為 50,比較 50 < b
bind2nd(less<T>(), 90);  // 限制 b 為 90,比較 a < b ##ReadMore##  
如果我想讓束縛函式限制我自訂的函式物件,該如何做?這時只要去繼承 binary_function 這個結構即可,我們可以稍微看一下他的長相:include/bits/stl_function.h
template <class _Arg1, class _Arg2, class _Result> 
struct binary_function
{
 typedef _Arg1 first_argument_type;
 typedef _Arg2 second_argument_type;
 typedef _Result result_type;
};
它是由三個樣板參數組成,前兩個為運算元(operand),第三個為回傳型別,所以以下實際舉個例子,定義一個繼承自 binary_function 的結構,名為 Less。
// 自訂函式物件的結構,並繼承自 binary_function
template <class _Tp> 
struct Less : public binary_function<_Tp, _Tp, bool>
{
 bool operator() (const _Tp& __x, const _Tp& __y) const
 {
  return __x < __y;
 }
};
接著透過 adjust 函式來使用束縛函式,並配合上面所定義的 Less 函式物件結構:
// 若資料小於門檻值,就直接調整成門檻值
template &ltclass Iter, class Fn, class T&gt  
void adjust( Iter itr1 , Iter itr2 , Fn fn, T threshold ) {
 for (; itr1 != itr2; ++itr1 )
 {
  if (fn(*itr1)) *itr1 = threshold ;
 }
}

int main() {
 srand((unsigned)time(NULL));

 int i;
 const int SIZE = 10;
 const int THRESHOLD = 50;

 vector<int> data1(SIZE);
 for (i = 0; i < SIZE; ++i) data1[i] = rand()%100+1;

 cout << "original data: ";      
 for (i = 0; i < SIZE; ++i) cout << data1[i] << ' ';      
 cout << endl;

 adjust(data1.begin(), data1.end(),
    bind1st(Less<int>(), THRESHOLD), THRESHOLD);

 cout << "changed data: ";      
 for (i = 0; i < SIZE; data1[i]; ++i) cout << data1[i] << ' ';
 cout << endl;
 return 0;
}
輸出結果:
original data: 58 25 13 96 11 47 68 33 86 35
changed data: 50 25 13 50 11 47 50 33 50 35

因此,只要繼承 binary_function,自訂的函式物件結構也能使用束縛函式。另外還有一個稱作否定函式,對象是單元的函式物件,所以只要自訂的函式物件結構去繼承 unary_function 即可。

2008年10月2日 星期四

TrueType 中的細明體、新細明體、與標楷體所造成文字破碎的情況

由於自己的論文,需要 pdf library 的輔助,來讀取該檔案格式,所以找來了 Xpdf 這個 open source 來使用,卻發現到當中文字使用微軟細明體、新細明體、或者是標楷體時,會發生文字破碎的清況...如下圖所示:( 我是在 Windows XP上面開發 )

2008年10月1日 星期三

將 MDF、MDS 轉換成 ISO 檔

最近在抓 Friends 的 DVD 版本,打算燒下來收藏,不過供檔的類型是 mdf、mds,甚至還有 md0、md1、md2...等,這個是 Alcohol 120% 可以支援的格式,不過懶的安裝,所以就把這些檔案(md*)轉換成 iso檔就方便多了。說是轉換,其實只是把這些檔案「串接」起來而已,指令如下:(假設有md0~md10、以及 mdf、mds)
 
Blogger Templates