/**
* Accelerated C++ 筆記
**/
//計(jì)算一個(gè)vector<double>類型的變量的中值
//值得注意的是,掉喲跟函數(shù)時(shí)整個(gè)vector參數(shù)都會(huì)被復(fù)制
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];
}
//根據(jù)期中,期末考試成績(jī)和保存家庭作業(yè)的向量來計(jì)算學(xué)生的總成績(jī)
//真?zhèn)€函數(shù)不用復(fù)制它的參數(shù),因?yàn)閙edian已經(jīng)為我們完成了這個(gè)工作
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));
}
//函數(shù)重載
double grade(double midterm, double final, double homework)
{
return 0.2 * midterm + 0.4 * final + 0.4 * homework;
}
/**
const vector<double>&這種類型被成為"對(duì)參數(shù)類型為double的向量常量的引用"
vector<double> homework;
vector<double>& hw = homework; //hw是homework的一個(gè)替代名,
//對(duì)hw的任何操作都等價(jià)于對(duì)homework的操作
const vector<double>& chw = homework; //chw是homework的一個(gè)替代名,
//const確保了我們將不會(huì)對(duì)chw的任何可能改變它的值的操作
vector<double>& hw1 = hw; //同hw等價(jià),是homework的一個(gè)替代名
const vector<double>& chw1 = chw; //同chw等價(jià),不允許寫訪問homework的一個(gè)替代名
**/
//從輸入流中將家庭作業(yè)的成績(jī)讀入到一個(gè)vector<double>中
istream read_hw(istream& in, vector<double>& hw)
{
if(in){
hw.clear(); //清除原先內(nèi)容
double x;
while(in >> x)
hw.push_back(x);
//清除流以使輸入動(dòng)作對(duì)于下一個(gè)學(xué)生有效
in.clear();
}
return in;
}
/**
* Accelerated C++ 筆記
**/
list容器相當(dāng)于數(shù)據(jù)結(jié)構(gòu)中的鏈表,vector容器相當(dāng)于順序表。
vector是為快速隨機(jī)訪問而被優(yōu)化的,同樣地,優(yōu)化了的list類型,可以讓我們?cè)谌萜鞯娜魏挝恢每焖俚牟迦牒蛣h除元素。
在vector內(nèi)部插入或刪除元素,為了保持快速隨機(jī)存取的特性,必須移動(dòng)位于被插入或刪除的元素后面的所有
元素。移動(dòng)元素意味著,時(shí)間復(fù)雜度為向量元素個(gè)數(shù)的二次方。
//用list代替vector:主要是因?yàn)椴迦牒蛣h除操作太多
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容器的迭代器不支持完全隨機(jī)訪問,所以我們就不能用標(biāo)準(zhǔn)庫(kù)中sort函數(shù)對(duì)它進(jìn)行排序。
對(duì)此,list提供了自己的sort成員函數(shù),這個(gè)函數(shù)使用了 一個(gè)優(yōu)化的算法來為存儲(chǔ)在list中的數(shù)值排序。
list<Student_info> students
students.sort(compare);//compare函數(shù)可以自己定義
posted @
2008-10-04 15:03 xuejzt 閱讀(1357) |
評(píng)論 (0) |
編輯 收藏
/**
* Accelerated C++ 筆記
**/
sort()函數(shù)定義在頭文件<algorithm>中,它把容器中的數(shù)據(jù)重新排序成非遞減序列。我們之所以用非遞減而不用遞增是因?yàn)椋萜髦械哪承?shù)據(jù)元素可能會(huì)與其他元素相等。
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函數(shù)巧妙地完成了任務(wù),它僅僅調(diào)換了原容器中元素值的相對(duì)順序,而不是創(chuàng)建一個(gè)新的容器來存儲(chǔ)排序后的結(jié)果。
//排序后求中數(shù)
vec_sz mid = size/2;
double median;
median = size % 2 == 0 ? (numbers[mid] + numbers[mid-1])/2 : numbers[mid];
//如果不希望改變向量本身,就可以通過函數(shù)參數(shù)的方式調(diào)用它
//調(diào)用函數(shù)時(shí)整個(gè)vector參數(shù)都會(huì)被復(fù)制
double median(vector<double> vec)
{
sort(vec.begin(), vec.end());
return 
}
posted @
2008-10-04 14:57 xuejzt 閱讀(7275) |
評(píng)論 (1) |
編輯 收藏
mplayer播放列表和循環(huán)播放:
$mplayer -playlist <playlist.m3u> -loop <times>
times為播放次數(shù),times=0 時(shí)一直循環(huán)。
編寫shell腳本實(shí)現(xiàn)音樂播放:
###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 閱讀(1780) |
評(píng)論 (0) |
編輯 收藏
emacs中復(fù)制粘貼與剪貼:
復(fù)制: M-w
粘貼: C-y
剪貼: C-w
環(huán)粘貼: M-y
復(fù)制中用的最多的是Mark set,即set-mark-command.默認(rèn)的快捷方式有:
1. C-spc
2. C-@
由于C-spc是系統(tǒng)默認(rèn)用來調(diào)用輸入法的,所以它被覆蓋了,那唯一的方式就是C-@。但是,說實(shí)話,這個(gè)按鍵需要很高的技巧,
偶反正按起來相當(dāng)困難,相當(dāng)不爽。所以偶用C-'來調(diào)用它。
(global-set-key [control \'] 'set-mark-command)
復(fù)制粘貼過程中還可能用到的:
全選: C-x h
歡迎大家給予補(bǔ)充和指正。。。
emacs里面undo有兩種快捷方式:
1. C-x u
2. C-/
我喜歡用第二種方式,因?yàn)橛闷饋砗芊奖悖乙驗(yàn)檫@種方式,讓我想到了用“C-;”來表示redo.因?yàn)?#8220;'”就在“/”的旁邊,當(dāng)
小指放在"\"上時(shí)無名指可以很輕松地放在";"上面。
redo的調(diào)用方式:
(require 'redo)
(global-set-key [(control \;)] 'redo)
程序的編譯
C++編譯器(如g++)也可以用于編譯C程序,事實(shí)上g++內(nèi)部還是調(diào)用了gcc,只不過加上了一些命令行參數(shù)使得它能夠識(shí)別C++源代碼。
gcc
在運(yùn)行是將完成預(yù)處理、編譯、匯編和連接4個(gè)步驟并最終生成可執(zhí)行代碼。產(chǎn)生的可執(zhí)行程序默認(rèn)情況下被保存為a.out文件。gcc命令可以接受多種文件
類型并依據(jù)用戶指定的命令參數(shù)對(duì)它們做出相應(yīng)的處理。這些文件類型包括:c/c++源文件(.c,
.cxx)、匯編語言源文件(.s)、預(yù)處理輸出文件(.i)、目標(biāo)代碼(.o)、靜態(tài)庫(kù)文件(.a)以及 動(dòng)態(tài)庫(kù)文件(.so).
摘要:
閱讀全文