《C++STL基础及应用》读书笔记
1、五種迭代器。
輸入迭代器重載 *、== 、!= 、前置++、后置++運算符。STL提供的主要輸入迭代器是 istream_iterator 。
它有兩種構造函數:
istream_iterator() :創建一個流結束的迭代器
istream_iterator(istream& ):參數是輸入流,含義是從輸入流中讀數據,當遇到流結束符時停止。
#include <iostream>#include <iterator>using namespace std;int main(){cout<<"Please Input(int): "<<endl;istream_iterator<int> a(cin);istream_iterator<int> b;while(1){cout<<*a<<endl;a++;if(a == b){cout<<"break"<<endl;break;}}}
輸出迭代器:
輸出迭代器重載 *、=、前置++、后置++運算符。STL提供的主要輸入迭代器是 ostream_iterator 。
它有兩種構造函數:
ostream_iterator(ostream& ) :創建一個流輸出迭代器,用來迭代out輸出流。
ostream_iterator(ostream& ,const char* delim):同上,只是輸出的數據之間用 delim 字符串分隔。
#include <iostream>#include <iterator>using namespace std;int main(){ostream_iterator<int> ostream_it(cout,"\t");for(int i = 0;i < 5; i++){*ostream_it = i;ostream_it++;}return 0;}?
前向迭代器:包含了輸入和輸出迭代器兩者的所有功能,加上還可以多次解析一個迭代器指定的位置,因此可以對一個值進行多次讀寫。顧名思義,前向迭代器只能向前移動,但是STL本身并沒有為專為前向迭代器預定義的迭代器。
雙向迭代器:包含了前向迭代器的所有功能,另外它還可以利用自減操作符向后移動一個位置。例如 list 容器需要的就是雙向迭代器。
隨機訪問迭代器:具有雙向迭代器的所有功能,再加上一個指針所有的功能。包括使用操作符operate[]進行索引,加某個整數值到一個指針就可以向前或向后移動若干位置,或者使用比較運算符在迭代器之間進行比較。比如 vector 容器需要的就是該類迭代器。
在一切情況下,都可以使用需求最細的隨機訪問迭代器,但過多的需求會降低它的效率。所以實際編程時應該選擇正好合適的iterator以期得到最高的效率。
?
文件讀寫:無論讀寫,文件不存在時都不會報異常。如果文件不存在,讀時數據為空,寫時創建新文件。
文件讀取:
#include <iostream>#include <fstream>using namespace std;int main(){//write file:string filename = "hello.cpp";ofstream fout;fout.open(filename.c_str());//ofstream fout(filename.c_str(),ios::app); //使用構造函數,可以判斷文件是否存在。如果用構造函數還是open(),文件不存在時,都可以自動創建。//if(!fout)//{// cout<<"file not found!create a new file."<<endl;//}fout<<"Key"<<"\t"<<"Value"<<endl;fout.close();//read file: ifstream fin(filename.c_str());string str;while(getline(fin,str)) //按行讀取(以\n為間隔符)。也可以 while(fin>>str) 這是以空格間隔符讀取
{cout<<str<<endl;}
fin.close();return 0;}
?
?二進制文件讀寫:
#include <iostream>#include <fstream>using namespace std;struct User{int id;char name[20];};int main(){User user1={1,"yugd"};User user2;string filename = "test.dfd";ofstream ofs(filename.c_str());ofs.write((const char*)&user1,sizeof(User));ofs.close();ifstream ifs(filename.c_str());ifs.read((char*)&user2,sizeof(User));cout<<"id: "<<user2.id<<"\tname: "<<user2.name<<endl;ifs.close();return 0;}?
輸入輸出流緩沖:
#include <iostream>#include <fstream>using namespace std;int main(){string filename = "test.cpp";ifstream ifs(filename.c_str());cout<<ifs.rdbuf();ifs.close();return 0;}
定位輸入輸出流:
?
函數對象:
必須重載 operator() 函數,函數對象調用方式為直接采用構造函數形式。
#include <iostream>#include <vector>using namespace std;int sum = 0;void f(int n){sum += n;}class SumClass{public:SumClass():sum(0){}void operator()(int n){sum += n;}int getSum(){return sum;}private:int sum;};template <typename T> class TSumClass{public:TSumClass():sum(0){}void operator()(T n){sum += n;}T getSum(){return sum;}private:T sum;};int main(){vector<int> vect;for(int i= 1;i<= 100;i++)vect.push_back(i);for_each(vect.begin(),vect.end(),f);cout<<"sum: "<<sum<<endl; //5050 SumClass obj = for_each(vect.begin(),vect.end(),SumClass()); //直接采用構造函數形式調用。 cout<<"obj.getSum(): "<<obj.getSum()<<endl; //5050 TSumClass<int> tobj = for_each(vect.begin(),vect.end(),TSumClass<int>());cout<<"tobj.getSum(): "<<tobj.getSum()<<endl; //5050 }?
merge():合并兩個排序列表;
splice():拼接兩個列表;
sort():列表的排序;
?
queue(隊列,先進先出)與stack(棧,后進先出)的構造函數:
queue(class T,class Container = deque<T>);
stack(class T,class Container = deque<T>);
其默認容器都是deque.
priority_queue 默認容器是 vector.
隊列獨有的函數:T& front();??? T& back();
堆棧獨有的函數:T& top();?? 返回棧頂元素,其實類似于 back();
容器適配器只是基礎容器類的再封裝,不是重新定義。
queue 可以使用 deque? 和 list 做為基礎容器(vector 沒有 pop_front 方法), stack 可以使用 deque、 list?和 vector 做為基礎容器。
?
再談迭代器:
非變異算法列表:
?
變異算法列表:
?
排序及相關函數列表:
總結
以上是生活随笔為你收集整理的《C++STL基础及应用》读书笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美工程序员—每个创业公司都在寻找的传奇人
- 下一篇: Linux 的性能进行监测