C++基礎
模板及標準模板庫
- 模板的作用
- 模板使程序員能夠快速的建立具有類型安全得庫集合和函數(shù)集合向拆,它的實現(xiàn),方便了大規(guī)模的軟件開發(fā)偏陪。
- 簡單的求最大值
#include <iostream>
using namespace std;
template <class X>
X Max(X a,X b)
{
return (a>b?a:b);
}
int main()
{
int x1=20,x2=100;
cout<<"max="<<Max<double>(x1,x2)<<endl;
double y1=22.3,y2=100.2;
cout<<"max="<<Max<double>(y1,y2)<<endl;
char z1='A',z2='z';
cout<<"max="<<Max<char>(z1,z2)<<endl;
}
- 模板定義
- 模板的定義很特殊抢呆,由 template<…> 處理的任何東西都意味著編譯器在當時不為它分配存儲空間,它一直處于等待狀態(tài)直到被一個模板實例告知笛谦。所以為了容易使用抱虐,幾乎總是在頭文件中放置全部的模板聲明和定義
#include <iostream>
using namespace std;
template <class X,class Y>
class Test
{
X m_t1;
Y m_t2;
public:
Test(X t1,Y t2)
{
m_t1=t1;
m_t2=t2;
}
void show()
{
cout<<"T1="<<m_t1<<"T2="<<m_t2<<endl;
}
void print();
};
template <class X,class Y>
void Test<X,Y>::print()
{
cout<<"t1="<<m_t1<<"t2="<<m_t2<<endl;
}
int main()
{
Test<int,char> t(10,'s');
t.show();
t.print();
}
-
類模板
- 使用類模板使用戶可以為類聲明一種模式,使得類中的某些數(shù)據(jù)成員饥脑、某些成員函數(shù)的參數(shù)恳邀、某些成員函數(shù)的返回值懦冰,能取任意類型(包括基本類型的和用戶自定義類型)。
- 定義
template <模板參數(shù)表> class 類名 {類成員聲明}
- 在類模板以外定義其成員函數(shù):
template <模板參數(shù)表> 類型名 類名<T>::函數(shù)名 ( 參數(shù)表 )
-
類模板與模板類的區(qū)別谣沸。
- 類模板是模板的定義刷钢,不是一個實實在在的類,定義中用到通用類型參數(shù)乳附。
- 模板類是實實在在的類定義内地,是類模板的實例化。類定義中參數(shù)被實際類型所代替赋除。
-
標準模板類
- 將程序寫的盡可能通用
- 將算法從特定的數(shù)據(jù)結構中抽象出來阱缓,成為通用的
- C++的模板為泛型的程序設計奠定了關鍵的基礎
- STL是泛型程序設計的一個范例
- 容器(container)
- 迭代器(itetator)
- 算法(algorithms)
- 函數(shù)對象(function object)
容器是容納包含一組元素集合的對象
-
基本容器
- 向量(vector)
- 雙端隊列(deque)
- 列表(list)
- 集合(set)
- 多重集合(multiset)
- 映射(map)
- 多重映射(multimap)
-
容器的接口
- 通用容器運算符
- ==,!=举农,>茬祷,>=,<并蝗,<=,=
- 方法(函數(shù))
- 迭代方法
- begin()秸妥,end()滚停,rbegin(),rend()
- 訪問方法
- size()粥惧,max_size()键畴,swap(),empty()
- 迭代方法
- 通用容器運算符
-
順序容器的接口
- 插入方法
- push_front()突雪,push_back()起惕,insert(),運算符“=”
- 刪除方法
- pop() 咏删,erase()惹想,clear()
- 迭代訪問方法
- 使用迭代器
- 其他順序容器訪問方法(不修改訪問方法)
- front(),back()督函,下標[ ]運算符
- 插入方法
vector
-
初始化 vector 容器方法
- vector<elementType> v; // 創(chuàng)建一個沒有任何元素的空容器
- vector<elementType> v(otherVec); //調用拷貝構造函數(shù)創(chuàng)建新容器
- vector<elementType> v(size); //創(chuàng)建一個大小為size的對象v嘀粱,并使用默認構造函數(shù)初始化該向量
- vector<elementType> v(n,elem); //創(chuàng)建一個大小為n的容器,并使用元素elem初始化每一個元素
- vector<elementType> v(begin,end); //創(chuàng)建容器v辰狡,并使用(begin锋叨,end)之間的元素初始化容器
-
元素的插入
- veclist.push_back(elem); //將elem的一個拷貝插入到veclist的末尾
- veclist.insert(position,elem); //將elem的一個拷貝插入到指定的position的位置上
- veclist.insert(position,n,elem); //將elem的n個拷貝插入到由position指定的位置上
- veclist.insert(position,beg,end); //將從迭代器 beg至end-1 之間的元素插入到veclist 的position位置上
-
元素的刪除
- veclist.clear(); //清空容器中所有元素
- veclist.erase(position); //刪除position指定位置的元素
- veclist.erase(beg,end); //刪除從beg至end-1之間的元素
- veclist.pop_back(); //刪除最后一個元素
-
迭代器其他常用函數(shù)
- veclist.capacity(); //返回當前可插入到容器veclist的最大數(shù)(capacity是指容器在必須分配新的存儲空間之前可以存放的元素總數(shù))
- veclist.empty(); //判斷容器是否為空,為空返回true宛篇,否則返回false
- veclist.size(); //返回容器veclist 中當前元素個數(shù)
- veclist.max_size(); //返回可以插入到容器中元素的最大個數(shù)(max_szie表示STL容器允許的最大元素數(shù)娃磺,通常,這個數(shù)是一個很大的常整數(shù)叫倍,可以理解為無窮大偷卧。這個數(shù)目與平臺和實現(xiàn)相關)
vector使用
#include <iostream>
#include <vector>
using namespace std;
vector<int> v;
int main()
{
int elem;
//從標準輸入設備輸入整形
//知道輸入的不是整形為止
while(cin>>elem)
{
v.push_back(elem);
}
for(int j=0;j<v.size();j++)
{
cout<<v[j]<<" ";
}
cout<<endl;
/*
for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)
{
cout<<ivec[ix] <<endl; // 用下標方式訪問
}
*/
for(vector<int>::iterator it=v.begin();it<v.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
for(vector<int>::reverse_iterator it=v.rbegin();it<v.rend();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
- vector 與指針
#include <iostream>
#include <vector>
using namespace std;
int *p1; //iterator i1;
const int *p2; //const_iterator i2;
int *const p3; //const iterator i3;
const int *const p4; //const const_iterator i4;
void show(vector<int> vi)
{
vector<int>::iterator it;
it=vi.begin();
while(it!=vi.end())
{
cout<<*it++<<' ';
}
cout<<endl;
};
int main()
{
vector<int> vi(3,90);
show(vi);
int a[5]={3,4,5,6,7};
vi.insert(vi.begin(),a,a+5);
show(vi);
vi.push_back(100);
show(vi);
cout<<"size:"<<vi.size()<<endl;
vi.assign(5,99);
show(vi);
cout<<"size:"<<vi.size()<<endl;
}
List
- list的使用
- list的四種構造函數(shù)
- list<elementType> L; //構造空容器L
- list<elementType> L(n, elem); //創(chuàng)建一個大小為size的對象L豺瘤,并使用elem元素進行初始化
- list<elementType> L(list1); //創(chuàng)建容器L,并使用已創(chuàng)建的容器list1進行初始化
- list<elementType> L(begin,end); //創(chuàng)建容器L涯冠,并使用(begin炉奴,end)之間的元素初始化容器
- list元素的插入
- L.push_back(elem); //向容器的末尾插入元素elem的拷貝
- L.push_front(elem); //向容器的開端插入元素elem的拷貝
- L.insert(position, elem); //向容器的position位置插入元素elem的拷貝
- L.insert(position, n, elem); //向容器的position位置上插入元素elem的n個拷貝
- L.insert(position, beg, end); //將迭代器beg至 end-1 指向的內(nèi)容插入到容器的position位置上
- L.splice(position, list); //將鏈表容器list中的元素插入到position位置上,并且清空list容器
- L.splice(position, list, pos); //將容器list中的pos位置上的元素插入到position位置上蛇更,并將pos位置上的元素從list中移除
- L.splice(position, list, beg, end); //將容器list中beg 至 end-1 位置上的元素插入到position位置上瞻赶,并將這些元素從list中移除
- 訪問容器元素
List<elementType>::iterator i;
使用begin, end 成員函數(shù)來操作List<elementType>::reverse_iterator ri;
使用rbegin, rend 成員函數(shù)來操作List<elementType>::const_iterator ci;
使用begin派任, end 成員函數(shù)來操作砸逊,但是只能訪問,不能進行修改
- 元素的刪除
- L.pop_back(); //刪除容器的最后一個元素
- L.pop_front(); //刪除容器的第一個元素
- L.clear(); //刪除容器的所有元素
- L.erase(position); //刪除容器指定位置的元素
- L.erase(beg, end); //刪除迭代器beg 至 end-1 之間的元素
- L.remove(elem); //移除與元素elem相等的元素
- list的四種構造函數(shù)
#include <iostream>
using namespace std;
#include <list>
int main()
{
int cpp[5]={3,6,1,7,5};
int java[8]={6,4,7,8,15,2,3,9};
int Unix[4]={5,2,6,9};
list<int> li;
li.insert(li.begin(),cpp,cpp+5);
li.insert(li.begin(),java,java+8);
li.insert(li.begin(),Unix,Unix+4);
li.sort();
li.unique();
li.reverse();
list<int>::iterator it=li.begin();
while(it!=li.end())
{
cout<<*it++<<' ';
}
cout<<endl;
}
/*
15 9 8 7 6 5 4 3 2 1
*/
#include <iostream>
#include <list>
using namespace std;
int main()
{
list<int> l1;
int a[5]={3,4,5,6,7};
list<int> l2(a,a+5);
cout<<"l1.size="<<l1.size()<<endl;
cout<<"l2.size="<<l2.size()<<endl;
list<int>::iterator it;
for(it=l2.begin();it!=l2.end();it++)
{
cout<<*it<<' ';
}
cout<<endl;
it=l2.begin();
it++;
l2.erase(it);//刪除it對應位置元素
l2.insert(l2.begin(),100);
l2.insert(l2.end(),200);
for(it=l2.begin();it!=l2.end();it++)
{
cout<<*it<<' ';
}
cout<<endl;
}
l1.size=0
l2.size=5
3 4 5 6 7
100 3 5 6 7 200
- map 使用
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
//key(是唯一的) value
map<int,string> mis;
//1. 插入map元素
mis.insert(make_pair(62,"東方不敗"));
mis.insert(make_pair(32,"岳不群"));
mis.insert(make_pair(36,"林平之"));
//2. 插入方式,這里的20不是下標
mis[20]="勞德羅";
//mis.insert(make_pair(36,"abc"));無法覆蓋
//mis[36]="xyz";//可覆蓋
map<int,string>::iterator it;
it=mis.begin();
//元素位置和key相關,和插入順序無關
//1.自動順序的
while(it!=mis.end())
{
cout<<it->first<<":"<<it->second<<endl;
++it;
}
}
/*
20:勞德羅
32:岳不群
36:林平之
62:東方不敗
*/
- 使用映射(map)建立阿拉伯數(shù)字0~9和英文單詞zero到nine的映射關系掌逛,并輸入阿拉伯數(shù)字(如1)师逸,輸出英文數(shù)字(如one)。
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
int num;
map<int,string> mis;
mis.insert(make_pair(0,"zero"));
mis.insert(make_pair(1,"one"));
mis.insert(make_pair(2,"two"));
mis.insert(make_pair(3,"three"));
mis.insert(make_pair(4,"four"));
mis.insert(make_pair(5,"five"));
mis.insert(make_pair(6,"six"));
mis.insert(make_pair(7,"seven"));
mis.insert(make_pair(8,"eight"));
mis.insert(make_pair(9,"nine"));
map<int,string>::iterator it;
cin>>num;
for(it=mis.begin();it!=mis.end();it++)
{
if(it->first==num)
cout<<it->second<<endl;
}
}
- vector 實現(xiàn)刪除指定元素(vector<int> num,從控制臺輸入int填充vector豆混,刪除指定元素)
#include <iostream>
#include <vector>
using namespace std;
vector<int> vi;
int main()
{
int elem;
int place;
while(cin>>elem)
{
vi.push_back(elem);
}
for(vector<int>::iterator it=vi.begin();it<vi.end();it++)
{
cout<<*it<<' ';
}
cout<<endl;
for(vector<int>::iterator it1=vi.begin();it1<vi.end();)
{
if(*it1==3)
{
it1=vi.erase(it1);
cout<<*it1<<endl;
}
else
it1++;
}
for(vector<int>::iterator it2=vi.begin();it2<vi.end();it2++)
{
cout<<*it2<<' ';
}
cout<<endl;
}
- const 的使用拓展
#include <iostream>
#include <vector>
using namespace std;
class Test
{
int m_t;
public:
Test(){}
void lianxi()const
{
cout<<"lianxi const"<<endl;
}
void lianxi()
{
cout<<"lianxi"<<endl;
}
};
int main()
{
const Test t1;
t1.lianxi();
Test t2;
t2.lianxi();
}