C 17 泛型演算法繫結器和智慧型指標

2021-10-09 04:54:10 字數 4686 閱讀 9356

將用**和注釋進行講解

/*

泛型演算法

特點一、泛型演算法的引數接受的都是迭代器

特點二、泛型演算法還可以接受函式物件

繫結器 + 二元函式物件 =》一元函式物件

bind1st:把二元函式物件的operator的第乙個形參繫結起來

bind2nd:把二元函式物件的operator的第二個形參繫結起來

取反器not1 一元函式取反

not2 二元函式取反

*/int

main()

; vector<

int>

vec(arr, arr +

sizeof

(arr)

/sizeof

(arr[0]

));for

(int c : vec)

cout << endl;

//預設從小到大排序

sort

(vec.

begin()

, vec.

end())

;for

(int c : vec)

cout << endl;

//有序容器的二分查詢if(

binary_search

(vec.

begin()

, vec.

end(),

11)) cout << endl;

//傳入函式物件greater,改變容器元素排序時比較方式

sort

(vec.

begin()

, vec.

end(

), greater<

int>()

);for(

int c : vec)

cout << endl;

//find_if需要一元函式物件 把48按序插入到二vector容器中,

auto it2 =

find_if

(vec.

begin()

, vec.

end(),

bind1st

(not1

(greater<

int>()

),48)

);//(int val)->bool );

vec.

insert

(it2,48)

;for

(int c : vec)

cout << endl;

//for_each 可以遍歷容器的所有元素,可以自行新增合適的函式物件對容器進行過濾

for_each

(vec.

begin()

,vec.

end(),

(int val)

->

void})

; cout << endl;

return0;

}

將所有智慧型指標進行仿寫,然後指明存在問題

智慧型指標

c++98 auto_ptr

c++11 unique_ptr

shared_ptr

weak_ptr

為了防止記憶體洩露,只能指標具有所有權唯一的特性

auto_ptr 所有權轉移

smart_ptr 釋放權轉移 在外部函式中被賦值運算子過載

unique_ptr 所有權唯一,不允許許可權轉移 禁止拷貝構造和賦值運算子過載

shared_ptr 帶引用計數的只能指標,強智慧型指標,類物件裡面含有智慧型指標相互指向的時候會出現析構錯誤

weak_ptr 弱智能指標,解決強智慧型指標相互引用的問題 不新增引用計數、不能單獨使用 */

template

<

typename t>

class

auto_ptr

//賦值或者拷貝構造後先定義的物件會出錯

~auto_ptr()

auto_ptr

(auto_ptr

& rhs)

auto_ptr operator

=(auto_ptr

& rhs)

return

*this;}

t*operator

->()

t&operator*(

)private

: t*

release()

t* mptr;};

//帶標誌位的智慧型指標:新的智慧型指標指向後獲得釋放權,舊指標失去釋放權

template

<

typename t>

class

smart_ptr

~smart_ptr()

mptr =

null;}

smart_ptr

( smart_ptr

& rhs)

smart_ptr

&operator

=( smart_ptr

& rhs)

return

*this;}

t*operator

->()

t&operator*(

)private

: t *mptr;

int flag;

//釋放權標誌位};

smart_ptr<

int>

getobject

(smart_ptr<

int>

& arg)

template

<

typename t>

class

unique_ptr

~unique_ptr()

t*operator

->()

t&operator*(

)private

:// unique_ptr(const unique&);

// unique_ptr& operator=(const unique_ptr&);

t* mptr;};

//shared_ptr

class

number

void

addref

(void

* ptr)

else

}void

delref

(void

* ptr)

else}}

intgetref

(void

* ptr)

else

}private

:int

findindex

(void

* ptr)

}return-1

;}class

node

public

:void

* addr;

int count;};

node node[10]

;int curindex;

//結構中有效元素個數};

template

<

typename t>

class

shared_ptr

shared_ptr

(const shared_ptr

& rhs)

shared_ptr operator=(

const shared_ptr

& rhs)

num.

delref

(mptr);if

(num.

getref

(mptr)==0

) mptr = rhs.mptr;

num.

addref

(mptr);}

~shared_ptr()

mptr ==

nullptr;}

t*operator

->()

t&operator*(

) t*

getptr()

const

private

: t* mptr;

static number num;};

template

<

typename t>

number shared_ptr

::num;

template

<

typename t>

class

weak_ptr

weak_ptr

(const weak_ptr

& rhs)

weak_ptr

&operator=(

const weak_ptr

& rhs)

mptr = rhs.mptr;

return

*this;}

weak_ptr

&operator=(

const shared_ptr

& rhs)

~weak_ptr()

t*operator

->()

t&operator*(

)private

: t* mptr;};

classb;

classa~

a() weak_ptrspa;};

classb~

b() weak_ptr spb;};

intmain()

C 17 之 結構繫結

注意 結構繫結 structured binding 位於iso iec14882 2017 11.5 節.結構繫結的作用是方便從其它資料結構中提取資料,如 pair,tuple,陣列等.通過結構繫結,可以替代 c 17 之前的 std tie,並且使用更加方便.通用的宣告方式為 auto v1,v...

C 泛型演算法

標準庫並未給每個容器都定義成員函式來實現這些操作,而是定義了一組泛型演算法,稱他們為演算法是因為他們實現了一些經典演算法的公共介面,如排序和搜尋 稱他們為排序的是因為它們可以用於不同型別的元素和多種容器型別。大多數演算法都定義在標頭檔案algorithm中。標準庫還在標頭檔案numeric中定義了一...

C 泛型演算法

1 泛型演算法初始 標準庫演算法都是對乙個範圍內的元素進行操作 除了少數例外 並將此範圍稱為 輸入範圍 而且總是使用前兩個引數來表示次範圍,這兩個引數分別代表,要處理的首元素和尾元素之後位置的迭代器。1.1 唯讀演算法 只會讀取輸入範圍內的元素,而從不改變元素 find int sum accumu...