C++學習筆記之模板篇

1、模板

無論是函數模板仍是類模板,在未初始化前都是不佔用內存的。 另一般來講模板代碼不能分開編譯,即不能分開寫成.h文件和.c文件,須要寫成一個文件。ios

函數模板

關鍵字:函數

  • template:用於聲明模板
  • typenameclass:聲明類型,做用相同,不過建議用typename

1.類型做爲模板參數
舉個例子:spa

template <class T>
T max(T a,T b)
{
    return (a>b)?a:b;
}

int ival = max<int>(100,99);

2.變量做爲模板參數
舉個例子:指針

template <int size>
void display()
{
    cout<<size<<endl;
}

display<10>();

3.多參數函數模板
舉個例子code

template <typename T,typename C>
void display(T t,C c)
{
    cout<<t<<c<<endl;
}

int a = 666;
string str = "marsggbo";
dispaly<int,string>(a,str);

4.數據類型和變量混用
仍是舉個栗子:blog

template <typename T,int size>
void display(T t)
{
    int i = 0;
    while(i++<size)
    {
        cout<<t<<endl;
    }
}

dispaly<int,6>(6);

類模板

template <typename T>
class A
{
public:
    A(T a);
    T display()
    {
        return A.a;
    }
private:
    T a;
}

每定義一個成員函數時都須要在前面加上template關鍵字,另外在類名後還須要加上類型,即 <T> ,舉個栗子:內存

template <typename T>
A::A(T x)
{
    A.a = x;
}

template <typename T>
T A<T>::display()
{
...
}

實例化類模板ci

int main(void)
{
    A<int> test;
    test.display();
    
    return 0;
}

2、標準模板庫

1. vector

  • vector初始化

vector初始化

  • vector經常使用函數

vector經常使用函數
特別注意,end() 返回的是向量迭代器末元素的下一個元素,因此若是要訪問最後一個元素,表達式是這樣的: *(--vector.end()) ,(ps:注意前面有個*號)string

代碼示例:
記得引入vector頭文件it

#include <iostream>
#include <vector>
using namespace std;

int main (void)
{
    vector<int> vec(6,6);   // 初始化爲6個6
    vec.push_back(5);   // 在末尾插入一個數據
    cout<<vec.size()<<endl; //vector的長度(數據數量)
    vec.pop_back();     // 刪除末尾的一個數據
    cout<<vec.size()<<endl;

    // 遍歷
    for(int i=0;i<vec.size();i++)
    {
        cout<<vec[i]<<endl;
    }
    return 0;
}
>>>
7
6
6
6
6
6
6
6

2.迭代器

迭代器至關於指針,要想訪問數據,須要加上*
直接看栗子吧

int main(void)
{
    vector<string> vec(2,"hello ");
    vec.push_back("marsggbo");
    vector<string>::iterator citer = vec.begin();
    cout<<*(--vec.end())<<endl; 
    for(;citer!=vec.end();citer++){
        cout<< *citer << endl;
    }
        
    return 0;
} 
>>>
marsggbo
hello
hello
marsggbo

3.鏈表list

注意鏈表遍歷的時候不能使用取下標的方式,只能經過迭代器進行遍歷。

int main(void)
{
    list<int> t;
    t.push_back(6);
    t.push_back(65);
    t.push_back(66);
        
    list<int>::iterator itor = t.begin();
    for(;itor!=t.end();itor++)
    {
        cout<<*itor<<endl;
    }
    return 0;
}

4.映射map

這個有點相似於Python中的字典。使用的關鍵字是mappair

map
使用示例:

int main(void)
{
    map<int,string> m;
    pair<int ,string> p1(666,"marsggbo");
    pair<int ,string> p2(222,"hexin");
    m.insert(p1);
    m.insert(p2);
    
    cout<<m[666]<<endl;
    cout<<m[222]<<endl;     
    return 0;
} 
>>>
marsggbo
hexin

map的遍歷方法:(仍是以上面的例子作基礎)

int main(void)
{
    map<int,string> m;
    pair<int ,string> p1(666,"marsggbo");
    pair<int ,string> p2(222,"hexin");
    m.insert(p1);
    m.insert(p2);
    
    map<int,string>::iterator itor = m.begin();
    for(;itor!=m.end();itor++)
    {
        cout<< itor->first <<":";     // 輸出鍵
        cout<< itor->second << endl;    // 輸出值
    }
} 

>>>
222:hexin
666:marsggbo

MARSGGBO原創

2017-4-6

相關文章
相關標籤/搜索