/**
* Accelerated C++ 筆記
**/
//計算一個vector<double>類型的變量的中值
//值得注意的是,掉喲跟函數時整個vector參數都會被復制
double median(vector<double> vec) //不改變向量本身
{
typedef vector<double>::size_type vec_sz;
vec_sz size = vec.size();
if(size == 0)
throw domain_error("median of an empty vector");
sort(vec.begin(), vec.end());
vec_sz mid = size/2;
return size % 2 == 0 ? (vec[mid]+vec[mid-1]) / 2 : vec[mid];
}
//根據期中,期末考試成績和保存家庭作業的向量來計算學生的總成績
//真個函數不用復制它的參數,因為median已經為我們完成了這個工作
double grade(double midterm, double final, const vector<double>& hw)
{
if(hw.size() == 0)
throw domain_error("student has done no homework");
return grade(midterm, final, median(hw));
}
//函數重載
double grade(double midterm, double final, double homework)
{
return 0.2 * midterm + 0.4 * final + 0.4 * homework;
}
/**
const vector<double>&這種類型被成為"對參數類型為double的向量常量的引用"
vector<double> homework;
vector<double>& hw = homework; //hw是homework的一個替代名,
//對hw的任何操作都等價于對homework的操作
const vector<double>& chw = homework; //chw是homework的一個替代名,
//const確保了我們將不會對chw的任何可能改變它的值的操作
vector<double>& hw1 = hw; //同hw等價,是homework的一個替代名
const vector<double>& chw1 = chw; //同chw等價,不允許寫訪問homework的一個替代名
**/
//從輸入流中將家庭作業的成績讀入到一個vector<double>中
istream read_hw(istream& in, vector<double>& hw)
{
if(in){
hw.clear(); //清除原先內容
double x;
while(in >> x)
hw.push_back(x);
//清除流以使輸入動作對于下一個學生有效
in.clear();
}
return in;
}
posted @
2008-10-04 15:07 xuejzt 閱讀(419) |
評論 (0) |
編輯 收藏
/**
* Accelerated C++ 筆記
**/
list容器相當于數據結構中的鏈表,vector容器相當于順序表。
vector是為快速隨機訪問而被優化的,同樣地,優化了的list類型,可以讓我們在容器的任何位置快速的插入和刪除元素。
在vector內部插入或刪除元素,為了保持快速隨機存取的特性,必須移動位于被插入或刪除的元素后面的所有
元素。移動元素意味著,時間復雜度為向量元素個數的二次方。
//用list代替vector:主要是因為插入和刪除操作太多
list<Student_info> extract_fails(list<Student_info>& students)
{
list<Student_info> fail;
list<Student_info>::iterator iter = students.begin();
while(iter != students.end()){
if(fgrade(*iter)){
fail.push_back(*iter);
iter = students.erase(iter);
}
else
++iter;
}
return fail;
}
list容器的迭代器不支持完全隨機訪問,所以我們就不能用標準庫中sort函數對它進行排序。
對此,list提供了自己的sort成員函數,這個函數使用了 一個優化的算法來為存儲在list中的數值排序。
list<Student_info> students
students.sort(compare);//compare函數可以自己定義
posted @
2008-10-04 15:03 xuejzt 閱讀(1341) |
評論 (0) |
編輯 收藏
/**
* Accelerated C++ 筆記
**/
sort()函數定義在頭文件<algorithm>中,它把容器中的數據重新排序成非遞減序列。我們之所以用非遞減而不用遞增是因為,容器中的某些數據元素可能會與其他元素相等。
double x;
vector<double> numbers;
typedef vector<double>::size_type vec_size;
vec_sz size = numbers.size();
while(cin >> x)
numbers.push_back(x);
sort(numbers.begin(), numbers.end());
//sort函數巧妙地完成了任務,它僅僅調換了原容器中元素值的相對順序,而不是創建一個新的容器來存儲排序后的結果。
//排序后求中數
vec_sz mid = size/2;
double median;
median = size % 2 == 0 ? (numbers[mid] + numbers[mid-1])/2 : numbers[mid];
//如果不希望改變向量本身,就可以通過函數參數的方式調用它
//調用函數時整個vector參數都會被復制
double median(vector<double> vec)
{
sort(vec.begin(), vec.end());
return 
}
posted @
2008-10-04 14:57 xuejzt 閱讀(7253) |
評論 (1) |
編輯 收藏
mplayer播放列表和循環播放:
$mplayer -playlist <playlist.m3u> -loop <times>
times為播放次數,times=0 時一直循環。
編寫shell腳本實現音樂播放:
###music.sh###
#!/bin/sh
musicPath="/media/..." #播放文件目錄
cd $musicPath
ls | grep -G "\.[WwMm].[Aa3]$" > music.lst
mplayer -playlist music.lst -loop 0
posted @
2008-10-04 14:47 xuejzt 閱讀(1759) |
評論 (0) |
編輯 收藏
emacs中復制粘貼與剪貼:
復制: M-w
粘貼: C-y
剪貼: C-w
環粘貼: M-y
復制中用的最多的是Mark set,即set-mark-command.默認的快捷方式有:
1. C-spc
2. C-@
由于C-spc是系統默認用來調用輸入法的,所以它被覆蓋了,那唯一的方式就是C-@。但是,說實話,這個按鍵需要很高的技巧,
偶反正按起來相當困難,相當不爽。所以偶用C-'來調用它。
(global-set-key [control \'] 'set-mark-command)
復制粘貼過程中還可能用到的:
全選: C-x h
歡迎大家給予補充和指正。。。
posted @
2008-10-04 14:38 xuejzt 閱讀(396) |
評論 (0) |
編輯 收藏
emacs里面undo有兩種快捷方式:
1. C-x u
2. C-/
我喜歡用第二種方式,因為用起來很方便,而且因為這種方式,讓我想到了用“C-;”來表示redo.因為“'”就在“/”的旁邊,當
小指放在"\"上時無名指可以很輕松地放在";"上面。
redo的調用方式:
(require 'redo)
(global-set-key [(control \;)] 'redo)
posted @
2008-10-04 14:36 xuejzt 閱讀(407) |
評論 (0) |
編輯 收藏
程序的編譯
C++編譯器(如g++)也可以用于編譯C程序,事實上g++內部還是調用了gcc,只不過加上了一些命令行參數使得它能夠識別C++源代碼。
gcc
在運行是將完成預處理、編譯、匯編和連接4個步驟并最終生成可執行代碼。產生的可執行程序默認情況下被保存為a.out文件。gcc命令可以接受多種文件
類型并依據用戶指定的命令參數對它們做出相應的處理。這些文件類型包括:c/c++源文件(.c,
.cxx)、匯編語言源文件(.s)、預處理輸出文件(.i)、目標代碼(.o)、靜態庫文件(.a)以及 動態庫文件(.so).
posted @
2008-09-19 16:35 xuejzt 閱讀(222) |
評論 (0) |
編輯 收藏
摘要:
閱讀全文
posted @
2008-09-19 16:27 xuejzt 閱讀(440) |
評論 (0) |
編輯 收藏