日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数

發布時間:2024/9/27 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


1.STL(Standard Template Library,是用泛型技術來設計完成的實例)的概念與組成

Iterator(迭代器)

Container(容器)

Algorithm(算法)

Adaptors(配接器)

?

STL的六大組件分別是:

容器(Container

算法(Algorithm

迭代器(Iterator

仿函數(Function object

適配器(Adapter

空間配置器(allocator:只能分配內存等

?

2.容器與算法

案例如下:

#include<iostream>

#include<vector>//容器

#include<array>//數組

#include<algorithm>

?

usingnamespacestd;

?

//實現一個模板類,專門實現打印的功能

template<classT>?//類模板實現了方法

classmyvectorprint

{

public:

???void operator ()(constT &t)//重載,使用(),打印

???{

???????std::cout << t <<std::endl;

???}

};

?

voidmain()

{

???vector<int>?myvector;

???myvector.push_back(11);

???myvector.push_back(21);

???myvector.push_back(31);

???myvector.push_back(81);

???myvector.push_back(51);

?

???array<int, 10> myarray = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };

?

???myvectorprint<int>print;//對于打印進行實例化

?

???//begin,endl迭代器,是一個指針

???for_each(myvector.begin(),myvector.end(),print);

???

???std::cout << "---------------------" <<std::endl;

?

???for_each(myarray.begin(),myarray.end(),print);

???cin.get();

???//算法可以適用于任何一個容器,for_each是一個算法

}

?

3.容器

序列式容器(Sequence containers

每個元素都有固定位置----取決于插入實際和地點,和元素之無關

Vector,deque,list

關聯式容器(Associated containers

元素位置取決于特定的排序準則,和插入順序無關

setmultisetmapmultimap

4.vectors:

將元素置于一個動態數組中加以管理

可以隨機存取元素(用索引直接存取)

數組尾部添加或移除元素非常快速,但是在中部或頭部安插元素比較費時。

5.數組線程容器

#include<iostream>

#include<vector>

#include<array>

#include<tuple>

?

usingnamespacestd;

?

voidmain()

{

???//數組,靜態數組,棧上

???array<int, 5> myarray = { 1, 2, 3, 4, 5 };

???

???//動態數組,堆上

???vector <int>myvector;

???myvector.push_back(1);

?

???//不需要變長,容量較小時,使用array

???//不需要變長,容量較大是,使用vector

}

6.list容器(添加和迭代輸出)

#include<iostream>

#include<hash_set>

#include<list>???//實際上是一個雙向鏈表

#include<stdio.h>

?

//list使用于經常插入,經常刪除

?

usingnamespacestd;

?

voidmain()

{

???list<int>mylist;

?

???mylist.push_back(1);

???mylist.push_back(2);

???mylist.push_back(3);

???mylist.push_back(4);

???mylist.push_front(4);//往頭部插入

?

???//指針,指向一個迭代器,迭代器存儲了位置

???autoibegin =mylist.begin();

???autoiend =mylist.end();

???//list用迭代器進行遍歷

???for (;ibegin !=iend;ibegin++)

???{

???????cout << *ibegin <<endl;

???????printf("%p,&p\n",ibegin._Ptr,ibegin);//重載

???}

???cin.get();

}

運行結果是:

7.list刪除應該注意的地方

#include<iostream>

#include<hash_set>

#include<list>???//實際上是一個雙向鏈表

#include<stdio.h>

?

//list使用于經常插入,經常刪除

?

usingnamespacestd;

?

voidmain()

{

???list<int>mylist;

???mylist.push_back(1);

???mylist.push_back(2);

???mylist.push_back(3);

???mylist.push_back(4);

???mylist.push_back(5);

???//auto i = mylist.begin();刪除元素,依賴于迭代器

???//++i

???//++i

???//++i

???autoi =mylist.end();//end最后一個沒有實體

???i--;

???mylist.erase(i);//鏈式存儲,不允許下標訪問

???//只能用迭代器,鏈表迭代器只能用++--

???//mylist.clear();清空

???//指針,指向一個迭代器,迭代器存儲了位置

???autoibegin =mylist.begin();

???autoiend =mylist.end();

???for (;ibegin !=iend;ibegin++)

???{

???????if ((*ibegin) == 3)

???????{

???????????mylist.erase(ibegin);//刪除,刪除的時候迭代器會發生

???????????break;//這里一定要記住,要使用break;因為list原來的結構已經發生了變化

???????}

???????//cout <<*ibegin << endl;

???}

???{

???????//指針,指向一個迭代器,迭代器存儲了位置

???????autoibegin =mylist.begin();

???????autoiend =mylist.end();

?

???????for (;ibegin !=iend;ibegin++)

???????{

???????????cout << *ibegin <<endl;

???????}

???}

???cin.get();

}

運行結果:

8.通過數組的方式為list初始化

#include<iostream>

#include<hash_set>

#include<list>???//實際上是一個雙向鏈表

#include<stdio.h>

?

//list使用于經常插入,經常刪除

?

usingnamespacestd;

?

voidmain()

{

???inta[5] = { 1, 2, 3, 4, 5 };

???list<int>mylist(a,a + 5);//根據數組初始化

???//傳遞開始地址,傳遞結束地址

???//mylist(0)

???//mylist[1];只能用迭代器訪問

???mylist.push_back(10);

???mylist.push_front(12);//在前添加數值

???//指針,指向一個迭代器,迭代器存儲了位置

???autoibegin =mylist.begin();

???autoiend =mylist.end();

?

???for (;ibegin !=iend;ibegin++)

???{

???????if (*ibegin == 3)

???????{

???????????mylist.insert(ibegin, 30);

???????????break;//刪除或者插入,迭代器都會發生變化

???????}

???}

?

???mylist.remove(30);//直接一個函數,根據元素來刪除

?

???{

???????autoibegin =mylist.begin();//指針,指向一個迭代器,迭代器存儲了位置

???????autoiend =mylist.end();

?

???????for (;ibegin !=iend;ibegin++)

???????{

???????????cout << *ibegin <<endl;

???????}

???}

???cin.get();

}

運行結果:

9.數組初始化,并逆向輸出

#include<iostream>

#include<hash_set>

#include<list>???//實際上是一個雙向鏈表

#include<stdio.h>

?

//list使用于經常插入,經常刪除

?

usingnamespacestd;

?

voidmain()

{

???inta[5] = { 1, 2, 3, 4, 5 };

???list<int>mylist(a,a + 5);//根據數組初始化

???autorb =mylist.rbegin();

???autore =mylist.rend();

???//同時正向方向查找

???for (;rb !=re;rb++)

???{

???????cout << *rb <<endl;

???}

???cin.get();

}

運行結果:

10.list合并,排序

#include<iostream>

#include<hash_set>

#include<list>???//實際上是一個雙向鏈表

#include<stdio.h>

?

//list使用于經常插入,經常刪除

?

usingnamespacestd;

?

voidmain()

{

???inta[5] = { 1, 2, 3, 104, 5 };

???list<int > mylist1(a,a + 5);//根據數組初始化,

???intb[5] = { 11, 122, 33, 44, 55 };

???list<int > mylist2(b,b + 5);//根據數組初始化,

???mylist1.sort();

???mylist2.sort();//兩個list合并到list之前需要數組排序

?

???mylist1.merge(mylist2);//合并之前必須有序

?

???{

???????autoibegin =mylist1.begin();//指針,指向一個迭代器,迭代器存儲了位置

???????autoiend =mylist1.end();

?

???????for (;ibegin !=iend;ibegin++)

???????{

???????????cout << *ibegin <<endl;

???????}

???}

???cout <<"\n\n\n";

???{

???????autoibegin =mylist2.begin();//指針,指向一個迭代器,迭代器存儲了位置

???????autoiend =mylist2.end();

?

???????for (;ibegin !=iend;ibegin++)

???????{

???????????cout << *ibegin <<endl;

???????}

???}

???cin.get();

}

運行結果:

11.list中通過unique()方法去掉重復的元素

#include<iostream>

#include<hash_set>

#include<list>???//實際上是一個雙向鏈表

#include<stdio.h>

?

//list使用于經常插入,經常刪除

?

usingnamespacestd;

?

voidmain()

{

???inta[6] = { 1, 2, 98, 2, 5, 98 };

???list<int>mylist1(a,a + 6);//根據數組初始化

???{

???????autoibegin =mylist1.begin();

???????autoiend =mylist1.end();

???????for (;ibegin !=iend;ibegin++)

???????{

???????????cout << *ibegin <<endl;

???????}

???}

???mylist1.sort();

???mylist1.unique();//唯一依賴于排序,通過這個方法實現了去掉重復的

???cout <<"\n\n\n";

???{

???????//指針,指向一個迭代器,迭代器存儲了位置

???????autoibegin =mylist1.begin();

???????autoiend =mylist1.end();

?

???????for (;ibegin !=iend;ibegin++)

???????{

???????????cout << *ibegin <<endl;

???????}

???}

???cin.get();

}

運行結果:

list迭代輸出

#include<iostream>

#include<set>

#include<stdio.h>

#include<list>

#include<vector>

#include<algorithm>

#include<functional>

?

usingnamespacestd;

voidmain()

{

???list<int>mylist;

?

???mylist.push_back(1);

???mylist.push_back(2);

???mylist.push_back(3);

???mylist.push_back(4);

???//mylist[1];

???autoibegin =mylist.begin();//指針,指向一個迭代器,迭代器存儲了位置

???autoiend =mylist.end();

???//list用迭代器進行遍歷

???for (;ibegin !=iend;ibegin++)

???{

???????cout << *ibegin <<endl;

???????printf("%p,%p\n",ibegin._Ptr,ibegin);//重載

???}

?

???cin.get();

}

運行結果:

12算法find

#include<algorithm>

#include<iostream>

usingnamespacestd;

?

structprint

{

???void operator()(intx)//重載了()符號,直接調用()

???{

???????std::cout << x <<endl;

???}

};

?

voidprintA(intx)

{

???std::cout << x <<endl;

}

?

//find這個算法

voidmain()

{

???inta[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

???int *p =find(a,a + 10, 8);

???std::cout << (void*)a << (void*)(a + 10) << std::endl;

???std::cout << *p <<endl;

???std::cout << p <<endl;

???if (p == (a + 10))

???{

???????std::cout << "沒有找到\n";

???}

???//下面的方式是調用重載的print函數

???for_each(a,a + 10,print());//遍歷每一個元素

???//printA是一個函數指針,必須是函數類型

???std::cout << "-------------------------" <<std::endl;

???for_each(a,a + 10,printA);

?

???cin.get();

}

運行結果:

13.find_if,bind1st,仿函數

#include<iostream>

#include<set>

#include<stdio.h>

#include<list>

#include<vector>

#include<algorithm>??//find_if的頭文件

#include<functional>?//仿函數需要這里

usingnamespacestd;

?

boolless3(intx)

{

???returnx < 3;

}

?

voidmain()

{

???vector<int>mylist;

???mylist.push_back(1);

???mylist.push_back(2);

???mylist.push_back(16);

???mylist.push_back(17);

???mylist.push_back(18);

?

???autoib =mylist.begin();

???autoie =mylist.end();

???for (;ib !=ie;ib++)

???{

???????std::cout << *ib <<std::endl;

???}

???//防函數可以實現一定的算法策略

???//bind1st表示要綁定一個函數

???//綁定一個函數,greater<int>(),3,表示比三大的數

???//查找第一個比3大的數值,下面的代碼的意思是找到第一個3比取出的數值大的數的位置

???autoifind =find_if(++mylist.begin(),mylist.end(),bind1st(greater<int>(), 3));

???std::cout << "\n\n\n\n" << *ifind << endl;

?

???std::cout << "---------------------" <<std::endl;

???autoifind2 =find_if(mylist.begin(),mylist.end(),less3);

???std::cout << "\n\n\n\n" << *ifind << endl;

?

???cin.get();

}

總結

以上是生活随笔為你收集整理的STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。