c++ 容器(list學習總結)

     list是一個線性雙向鏈表結構,它的數據由若干個節點構成,每個節點都包括一個信息塊(即實際存儲的數據)、一個前驅指針和一個後驅指針。它無需分配指定的內存大小且能夠任意伸縮,這是由於它存儲在非連續的內存空間中,而且由指針將有序的元素連接起來。因爲其結構的緣由,list 隨機檢索的性能很是的很差,由於它不像vector 那樣直接找到元素的地址,而是要從頭一個一個的順序查找,這樣目標元素越靠後,它的檢索時間就越長。檢索時間與目標元素的位置成正比。雖然隨機檢索的速度不夠快,可是它能夠迅速地在任何節點進行插入和刪除操做。由於list 的每一個節點保存着它在鏈表中的位置,插入或刪除一個元素僅對最多三個元素有所影響,不像vector 會對操做點以後的全部元素的存儲地址都有所影響,這一點是vector 不可比擬的。ios

list 的特色:算法

(1) 不使用連續的內存空間這樣能夠隨意地進行動態操做;
(2) 能夠在內部任何位置快速地插入或刪除,固然也能夠在兩端進行push 和pop 。
(3) 不能進行內部的隨機訪問,即不支持[ ] 操做符和vector.at() ;
(4) 相對於verctor 佔用更多的內存。函數

初學list:須要掌握的知識:性能

(1)定義一個list spa

(2)向list中加入元素 指針

(3)如何知道list是否爲空 對象

(4)如何使用for循環來遍歷一個list blog

(5)如何使用STL的通用算法for_each來遍歷list 內存

(6)list成員函數begin() 和 end() 以及它們的意義 字符串

(7)iterator範圍的概念和一個範圍的最後一個位置實際上並不被處理這一事實 

第一:定義,插入,遍歷打印。

    代碼實現以下:

#include<stdio.h>
#include<iostream>
#include<list>
#include<string>
#include<algorithm>
using namespace std;

 

void PrintIt(string& StringToPoint)
{
cout << StringToPoint << endl;
}

int main()

{

list<string> test;

list<string>::iterator testiterator;

test.push_back("no");
test.push_back("march");
test.push_front("ok");
test.push_front("loleina");
test.push_front("begin");
test.push_back("end");

 

for (testiterator = test.begin(); testiterator != test.end(); ++testiterator)
{
cout << *testiterator << endl;
}
cout << "-------------" << endl;


for_each(test.begin(), test.end(), PrintIt);
cout << "-------------" << endl;

system("PAUSE");
return 0;
}

定義了一個字符串類型的list。須要包含提供STL的 list類的頭文件#include <list>便可;list的成員函數push_back()把一個對象放到一個list的後面,而 push_front()把對象放到前面。

咱們想要遍歷一個list,好比打印一個list中的全部對象來看看list上不一樣操做的結果。要一個元素一個元素的遍歷一個list, 能夠這樣作:

A. 這個程序定義了一個iterator(相似指針),testiterator。它指向了這個list的第一個元素。 這能夠調用testiterator.begin()來作到,它會返回一個指向list開頭的iterator。而後把它和testiterator.end()的 返回值來作比較,到了那兒的時候就停下來。 容器的end()函數會返回一個指向容器的最後一個位置的iterator。 在上面的例子中,每一次執行for循環,咱們就重複引用iterator來獲得咱們打印的字符串。

    注意:不能用testiterator.begin()+2來指向list中的第三個對象,由於STL的list是以雙鏈的list來實現的,全部的數據存放不必定是連續存放的。 它不支持隨機存取。

B.使用STL的通用算法for_each()來遍歷一個iterator的範圍,而後調用PrintIt()來處理每一個對象。 不須要初始化、比較和給iterator增量。for_each()完成了這些工做。執行於對象上的操做被很好的 打包在這個函數之外了,不用再作那樣的循環了,代碼更加清晰了。 

第二:count()和count_if() 的基本使用

     STL的通用算法count()和count_it()用來給容器中的對象記數。就象for_each()同樣,count()和count_if() 算法也是在iterator範圍內來作的。

#include<stdio.h>
#include<iostream>
#include<list>
#include<string>
#include<algorithm>
using namespace std;

class IsLoleina
{
public:
bool operator()(string& name)
{
return name == "loleina";
}

};

int main()
{
list<string> test;
list<int> score;
list<string>::iterator testiterator;

test.push_back("no");
test.push_back("march");
test.push_front("ok");
test.push_front("loleina");
test.push_front("begin");
test.push_back("end");


score.push_back(100);
score.push_back(90);
score.push_back(80);
score.push_back(70);
score.push_back(100);
score.push_back(20);


int countNum(0);

countNum= count(score.begin(), score.end(), 100);
cout << "there are " << countNum << " scores of 100" << endl;
cout << "-------------" << endl;

int countLoleina(0);
countLoleina=count_if(test.begin(), test.end(), IsLoleina());
cout << "there are " << countLoleina << " loleina" << endl;

system("PAUSE"); return 0;   count()算法統計等於某個值的對象的個數。count_if() 帶一個函數對象的參數。函數對象是一個至少帶有一個operator()方法的類。有些STL算法做爲參數接收函數對象並調用這個函數對象的operator()方法。函數對象被約定爲STL算法調用operator時返回true或false。它們根據這個來斷定這個函數。舉個例子會 說的更清楚些。count_if()經過傳遞一個函數對象來做出比count()更加複雜的評估以肯定一個對象是否應該被記數。

相關文章
相關標籤/搜索