#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <boost/lambda/lambda.hpp>
using namespace std;
using namespace boost::lambda;
int main( int argc, char * argv[] ) {
vector< size_t > v;
copy( istream_iterator< size_t >( cin ), istream_iterator< size_t >(), back_inserter( v ) );
sort( v.begin(), v.end(), _1 > _2 );
for_each( v.begin(), v.end(), cout << _1 << '\n' );
return 0;
}
以上和以下同義:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
template< typename T > inline bool gt( T a, T b ) { return a > b; }
int main( int argc, char * argv[] ) {
size_t temp;
vector< size_t > v;
while( cin >> temp ) {
v.push_back( temp );
}
sort( v.begin(), v.end(), gt< size_t > );
for( size_t i = 0; i < v.size(); ++i ) {
cout << v[i] << '\n';
}
return 0;
}
簡單地說,先從輸入串流讀入一串數字存入陣列,再反序排序,最後全部印出來。
首先仔細地檢視我們要什麼。事實上輸入的動作只要從串流複製一份資料到陣列裡即可,因此使用algorithm的copy和iterator的功能就可以達成目的。
至於排序,預設是遞減排序,其他排法必須要另外再寫一個比較函式。因此這裡使用Boost的lambda函式來減少多餘的宣告。lambda function就是一個臨時的匿名函式,不少高階語言都有,但是C++目前的標準函式庫沒有;Boost是C++標準委員會所擴充的函式庫,基本上很有希望加入為新的標準。
最後是輸出;其實這裡用copy也可以,只是這樣就很難在項目之間插入空白或換行,因此使用algorithm的for_each加上lambda functor。
首先仔細地檢視我們要什麼。事實上輸入的動作只要從串流複製一份資料到陣列裡即可,因此使用algorithm的copy和iterator的功能就可以達成目的。
至於排序,預設是遞減排序,其他排法必須要另外再寫一個比較函式。因此這裡使用Boost的lambda函式來減少多餘的宣告。lambda function就是一個臨時的匿名函式,不少高階語言都有,但是C++目前的標準函式庫沒有;Boost是C++標準委員會所擴充的函式庫,基本上很有希望加入為新的標準。
最後是輸出;其實這裡用copy也可以,只是這樣就很難在項目之間插入空白或換行,因此使用algorithm的for_each加上lambda functor。
不要問我為什麼使用using namespace...這只是示範....
沒有留言:
張貼留言