青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

ACM___________________________

______________白白の屋
posts - 182, comments - 102, trackbacks - 0, articles - 0
<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

常用鏈接

留言簿(24)

隨筆分類(332)

隨筆檔案(182)

FRIENDS

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜

MiYu原創(chuàng), 轉(zhuǎn)帖請注明 : 轉(zhuǎn)載自 ______________白白の屋    

 

定義一個list

  我們可以象這樣來定義一個STL的list: 

#include <string>
#include <list>
int main (void) 
{
 list<string> Milkshakes;
 return 0;
}

  這就行了,你已經(jīng)定義了一個list。簡單嗎?list<string> Milkshakes這句是你聲明了list<string>模板類 的一個實例,然后就是實例化該類的一個對象。但是我們別急著做這個。在這一步其實你只需要知道你定義了 一個字符串的list。你需要包含提供STL list類的頭文件。我用gcc 2.7.2在我的Linux上編譯這個測試程序,例如: 

  g++ test1.cpp -o test1 注意iostream.h這個頭文件已經(jīng)被STL的頭文件放棄了。這就是為什么這個例子中沒有它的原因。 

  現(xiàn)在我們有了一個list,我們可以看實使用它來裝東西了。我們將把一個字符串加到這個list里。有一個非常 重要的東西叫做list的值類型。值類型就是list中的對象的類型。在這個例子中,這個list的值類型就是字符串,string , 這是因為這個list用來放字符串。 

  使用list的成員函數(shù)push_back和push_front插入一個元素到list中:

#include <string>
#include <list>

int main (void) 
{
 list<string> Milkshakes;
 Milkshakes.push_back("Chocolate");
 Milkshakes.push_back("Strawberry");
 Milkshakes.push_front("Lime");
 Milkshakes.push_front("Vanilla");
 return 0;
}

  我們現(xiàn)在有個4個字符串在list中。list的成員函數(shù)push_back()把一個對象放到一個list的后面,而 push_front()把對象放到前面。我通常把一些錯誤信息push_back()到一個list中去,然后push_front()一個標題到list中, 這樣它就會在這個錯誤消息以前打印它了。

The list member function empty()list的成員函數(shù)empty()

  知道一個list是否為空很重要。如果list為空,empty()這個成員函數(shù)返回真。 我通常會這樣使用它。通篇程序我都用push_back()來把錯誤消息放到list中去。然后,通過調(diào)用empty() 我就可以說出這個程序是否報告了錯誤。如果我定義了一個list來放信息,一個放警告,一個放嚴重錯誤, 我就可以通過使用empty()輕易的說出到底有那種類型的錯誤發(fā)生了。 

  我可以整理這些list,然后在打印它們之前,用標題來整理它們,或者把它們排序成類。 

/*
|| Using a list to track and report program messages and status 
*/
#include <iostream.h>
#include <string>
#include <list>
int main (void) 
{
 #define OK 0 
 #define INFO 1
 #define WARNING 2
 int return_code;
 list<string> InfoMessages;
 list<string> WarningMessages;

 // during a program these messages are loaded at various points
 InfoMessages.push_back("Info: Program started");
 // do work...
 WarningMessages.push_back("Warning: No Customer records have been found");
 // do work...

 return_code = OK; 

 if (!InfoMessages.empty()) {
  // there were info messages
  InfoMessages.push_front("Informational Messages:");
  // ... print the info messages list, we'll see how later
  return_code = INFO;
 }

 if (!WarningMessages.empty()) {
  // there were warning messages
  WarningMessages.push_front("Warning Messages:");
  // ... print the warning messages list, we'll see how later
  return_code = WARNING; 
 }

 // If there were no messages say so.
 if (InfoMessages.empty() && WarningMessages.empty()) {
  cout << "There were no messages " << endl;
 }

 return return_code;
}

用for循環(huán)來處理list中的元素

  我們想要遍歷一個list,比如打印一個中的所有對象來看看list上不同操作的結果。要一個元素一個元素的遍歷一個list, 我們可以這樣做: 

/*
|| How to print the contents of a simple STL list. Whew! 
*/
#include <iostream.h>
#include <string>
#include <list>

int main (void) 
{
 list<string> Milkshakes;
 list<string>::iterator MilkshakeIterator;

 Milkshakes.push_back("Chocolate");
 Milkshakes.push_back("Strawberry");
 Milkshakes.push_front("Lime");
 Milkshakes.push_front("Vanilla");

 // print the milkshakes
 Milkshakes.push_front("The Milkshake Menu");
 Milkshakes.push_back("*** Thats the end ***");
 for (MilkshakeIterator=Milkshakes.begin(); MilkshakeIterator!=Milkshakes.end(); ++MilkshakeIterator) 
 {
  // dereference the iterator to get the element
  cout << *MilkshakeIterator << endl;
 } 
}

  這個程序定義了一個iterator,MilkshakeIterator。我們把它指向了這個list的第一個元素。 這可以調(diào)用Milkshakes.begin()來作到,它會返回一個指向list開頭的iterator。然后我們把它和Milkshakes.end()的 返回值來做比較,當我們到了那兒的時候就停下來。 

  容器的end()函數(shù)會返回一個指向容器的最后一個位置的iterator。當我們到了那里,就停止操作。 我們不能不理容器的end()函數(shù)的返回值。我們僅知道它意味著已經(jīng)處理到了這個容器的末尾,應該停止處理了。 所有的STL容器都要這樣做。 

  在上面的例子中,每一次執(zhí)行for循環(huán),我們就重復引用iterator來得到我們打印的字符串。 

  在STL編程中,我們在每個算法中都使用一個或多個iterator。我們使用它們來存取容器中的對象。 要存取一個給定的對象,我們把一個iterator指向它,然后間接引用這個iterator。 

  這個list容器,就象你所想的,它不支持在iterator加一個數(shù)來指向隔一個的對象。 就是說,我們不能用Milkshakes.begin()+2來指向list中的第三個對象,因為STL的list是以雙鏈的list來實現(xiàn)的, 它不支持隨機存取。vector和deque(向量和雙端隊列)和一些其他的STL的容器可以支持隨機存取。 

  上面的程序打印出了list中的內(nèi)容。任何人讀了它都能馬上明白它是怎麼工作的。它使用標準的iterator和標準 的list容器。沒有多少程序員依賴它里面裝的東西, 僅僅是標準的C++。這是一個向前的重要步驟。這個例子使用STL使我們的軟件更加標準。 

  用STL的通用算法for_each來處理list中的元素

  使用STL list和 iterator,我們要初始化、比較和給iterator增量來遍歷這個容器。STL通用的for_each 算法能夠減輕我們的工作。 

/*
|| How to print a simple STL list MkII
*/
#include <iostream.h>
#include <string>
#include <list>
#include <algorithm>

PrintIt (string& StringToPrint) {
 cout << StringToPrint << endl;
}

int main (void) {
 list<string> FruitAndVegetables;
 FruitAndVegetables.push_back("carrot");
 FruitAndVegetables.push_back("pumpkin");
 FruitAndVegetables.push_back("potato");
 FruitAndVegetables.push_front("apple");
 FruitAndVegetables.push_front("pineapple");

 for_each (FruitAndVegetables.begin(), FruitAndVegetables.end(), PrintIt);
}

  在這個程序中我們使用STL的通用算法for_each()來遍歷一個iterator的范圍,然后調(diào)用PrintIt()來處理每個對象。 我們不需要初始化、比較和給iterator增量。for_each()為我們漂亮的完成了這些工作。我們執(zhí)行于對象上的 操作被很好的打包在這個函數(shù)以外了,我們不用再做那樣的循環(huán)了,我們的代碼更加清晰了。 

  for_each算法引用了iterator范圍的概念,這是一個由起始iterator和一個末尾iterator指出的范圍。 起始iterator指出操作由哪里開始,末尾iterator指明到哪結束,但是它不包括在這個范圍內(nèi)。

 用STL的通用算法count()來統(tǒng)計list中的元素個數(shù)


  STL的通用算法count()和count_it()用來給容器中的對象記數(shù)。就象for_each()一樣,count()和count_if() 算法也是在iterator范圍內(nèi)來做的。 

  讓我們在一個學生測驗成績的list中來數(shù)一數(shù)滿分的個數(shù)。這是一個整型的List。 

/*
|| How to count objects in an STL list
*/
#include <list>
#include <algorithm>
#
int main (void) 
{
 list<int> Scores;
 #
 Scores.push_back(100); Scores.push_back(80);
 Scores.push_back(45); Scores.push_back(75);
 Scores.push_back(99); Scores.push_back(100);
 #
 int NumberOf100Scores(0); 
 count (Scores.begin(), Scores.end(), 100, NumberOf100Scores);
 #
 cout << "There were " << NumberOf100Scores << " scores of 100" << endl;
}

  count()算法統(tǒng)計等于某個值的對象的個數(shù)。上面的例子它檢查list中的每個整型對象是不是100。每次容器中的對象等于100,它就給NumberOf100Scores加1。這是程序的輸出: 

There were 2 scores of 100

  用STL的通用算法count_if()來統(tǒng)計list中的元素個數(shù)

  count_if()是count()的一個更有趣的版本。他采用了STL的一個新組件,函數(shù)對象。count_if() 帶一個函數(shù)對象的參數(shù)。函數(shù)對象是一個至少帶有一個operator()方法的類。有些STL算法作為參數(shù)接收 函數(shù)對象并調(diào)用這個函數(shù)對象的operator()方法。 

  函數(shù)對象被約定為STL算法調(diào)用operator時返回true或false。它們根據(jù)這個來判定這個函數(shù)。舉個例子會 說的更清楚些。count_if()通過傳遞一個函數(shù)對象來作出比count()更加復雜的評估以確定一個對象是否應該被 記數(shù)。在這個例子里我們將數(shù)一數(shù)牙刷的銷售數(shù)量。我們將提交包含四個字符的銷售碼和產(chǎn)品說明的銷售記錄。 

/*
|| Using a function object to help count things
*/
#include <string>
#include <list>
#include <algorithm>

const string ToothbrushCode("0003");

class IsAToothbrush 
{
 public: 
  bool operator() ( string& SalesRecord ) 
  {
   return SalesRecord.substr(0,4)==ToothbrushCode;
  } 
};

int main (void) 
{
 list<string> SalesRecords;

 SalesRecords.push_back("0001 Soap");
 SalesRecords.push_back("0002 Shampoo");
 SalesRecords.push_back("0003 Toothbrush");
 SalesRecords.push_back("0004 Toothpaste");
 SalesRecords.push_back("0003 Toothbrush");

 int NumberOfToothbrushes(0); 
 count_if (SalesRecords.begin(), SalesRecords.end(), 
 IsAToothbrush(), NumberOfToothbrushes);

 cout << "There were " 
?。迹?NumberOfToothbrushes 
?。迹?" toothbrushes sold" << endl;
}

  這是這個程序的輸出: 

  There were 2 toothbrushes sold 這個程序是這樣工作的:定義一個函數(shù)對象類IsAToothbrush,這個類的對象能判斷出賣出的是否是牙刷 。如果這個記錄是賣出牙刷的記錄的話,函數(shù)調(diào)用operator()返回一個true,否則返回false。 

  count_if()算法由第一和第二兩個iterator參數(shù)指出的范圍來處理容器對象。它將對每個 IsAToothbrush()返回true的容器中的對象增加NumberOfToothbrushes的值。 

  最后的結果是NumberOfToothbrushes這個變量保存了產(chǎn)品代碼域為"0003"的記錄的個數(shù),也就是牙刷的個數(shù)。 

  注意count_if()的第三個參數(shù)IsAToothbrush(),它是由它的構造函數(shù)臨時構造的一個對象。你可以把IsAToothbrush類的一個臨時對象 傳遞給count_if()函數(shù)。count_if()將對該容器的每個對象調(diào)用這個函數(shù)。 

 

使用count_if()的一個更加復雜的函數(shù)對象

  我們可以更進一步的研究一下函數(shù)對象。假設我們需要傳遞更多的信息給一個函數(shù)對象。我們不能通過 調(diào)用operator來作到這點,因為必須定義為一個list的中的對象的類型。 然而我們通過為IsAToothbrush指出一個非缺省的構造函數(shù)就可以用任何我們所需要的信息來初始化它了。 例如,我們可能需要每個牙刷有一個不定的代碼。我們可以把這個信息加到下面的函數(shù)對象中: 

/*
|| Using a more complex function object
*/
#include <iostream.h>
#include <string>
#include <list>
#include <algorithm>

class IsAToothbrush 
{
 public:
  IsAToothbrush(string& InToothbrushCode) : 
  ToothbrushCode(InToothbrushCode) {}
  bool operator() (string& SalesRecord) 
  {
   return SalesRecord.substr(0,4)==ToothbrushCode;
  } 
 private:
  string ToothbrushCode; 
};

int main (void) 
{
 list<string> SalesRecords;

 SalesRecords.push_back("0001 Soap");
 SalesRecords.push_back("0002 Shampoo");
 SalesRecords.push_back("0003 Toothbrush");
 SalesRecords.push_back("0004 Toothpaste");
 SalesRecords.push_back("0003 Toothbrush");

 string VariableToothbrushCode("0003");

 int NumberOfToothbrushes(0); 
 count_if (SalesRecords.begin(), SalesRecords.end(), 
 IsAToothbrush(VariableToothbrushCode),
 NumberOfToothbrushes);
 cout << "There were "
?。迹?NumberOfToothbrushes 
?。迹?" toothbrushes matching code "
 << VariableToothbrushCode
 << " sold" 
?。迹?endl;
}

  程序的輸出是: 

  There were 2 toothbrushes matching code 0003 sold 這個例子演示了如何向函數(shù)對象傳遞信息。你可以定義任意你想要的構造函數(shù),你可以再函數(shù)對象中做任何你 想做的處理,都可以合法編譯通過。 

  你可以看到函數(shù)對象真的擴展了基本記數(shù)算法。 

 

Feedback

# re: 標準模板庫(STL)學習---List容器 ( 轉(zhuǎn)載 )  回復  更多評論   

2010-08-30 16:08 by jince
怎么轉(zhuǎn)載~~

# re: 標準模板庫(STL)學習---List容器 ( 轉(zhuǎn)載 )  回復  更多評論   

2010-09-01 16:20 by MiYu
呃, 我也不是很清楚 , 我復制過來了
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲综合大片69999| 国内综合精品午夜久久资源| 亚洲日本视频| 欧美 日韩 国产 一区| 看片网站欧美日韩| 麻豆精品91| 91久久久久久| 亚洲一区二区精品| 欧美亚洲三级| 久久夜色精品国产| 欧美精品日韩综合在线| 欧美日韩精品高清| 国产日韩欧美精品一区| 激情欧美一区二区三区| 亚洲日本欧美在线| 亚洲尤物视频网| 久久蜜桃精品| 亚洲精品欧美日韩专区| 亚洲欧美日韩专区| 欧美jizzhd精品欧美喷水 | 小辣椒精品导航| 久久精品国产久精国产一老狼| 免费一级欧美片在线观看| 亚洲人成网站999久久久综合| 中国亚洲黄色| 久久香蕉国产线看观看网| 欧美日韩小视频| 加勒比av一区二区| 亚洲特色特黄| 欧美激情一级片一区二区| 亚洲在线播放电影| 欧美成人综合一区| 国产日韩在线看| 亚洲一区二区久久| 蜜桃av综合| 欧美一区影院| 国产精品萝li| 99精品99久久久久久宅男| 久久久久久亚洲精品中文字幕| 日韩系列在线| 欧美高清成人| 精品av久久707| 香蕉久久夜色精品国产使用方法 | 久久精品国产成人| 亚洲国产欧美日韩精品| 久久九九全国免费精品观看| 国产美女精品| 欧美尤物一区| 一区二区三区日韩| 欧美特黄一级| 制服丝袜激情欧洲亚洲| 亚洲国产精品久久久久久女王| 久久久www成人免费无遮挡大片 | 欧美寡妇偷汉性猛交| 尤物视频一区二区| 狼狼综合久久久久综合网| 性色av一区二区三区| 国产九色精品成人porny| 亚洲在线视频一区| 一区二区三区免费看| 欧美日韩伦理在线免费| 一区二区三区av| 亚洲精品乱码久久久久久蜜桃91| 欧美刺激性大交免费视频| 亚洲欧洲偷拍精品| 亚洲人精品午夜| 欧美日韩一区不卡| 香蕉免费一区二区三区在线观看| 亚洲一区二区三区在线| 国产毛片精品国产一区二区三区| 久久大逼视频| 久久久久成人网| 亚洲欧洲一区二区三区在线观看 | 亚洲尤物视频网| 国产日韩精品一区二区三区| 久久精品国产精品亚洲综合| 久久精品国产欧美激情| 永久免费精品影视网站| 欧美护士18xxxxhd| 欧美日韩精选| 久久av免费一区| 久久综合狠狠综合久久综合88 | 亚洲裸体俱乐部裸体舞表演av| 最近中文字幕日韩精品| 欧美三级午夜理伦三级中视频| 亚洲欧美在线免费观看| 性感少妇一区| 日韩香蕉视频| 午夜伦理片一区| 亚洲茄子视频| 亚洲制服av| 亚洲第一中文字幕| 一区二区三区精密机械公司| 国内精品久久久久久久影视麻豆| 亚洲第一天堂av| 国产精品美女www爽爽爽| 亚洲精品网站在线播放gif| 亚洲国内精品| 亚洲一区二区三区免费观看| 国内精品久久久久影院色| 亚洲第一搞黄网站| 国产欧美一区二区精品婷婷| 亚洲国产午夜| 国产偷国产偷精品高清尤物| 亚洲国产精品精华液网站| 国产日韩精品一区| 日韩性生活视频| 亚洲第一色中文字幕| 亚洲影院免费| 亚洲美女视频在线观看| 香蕉成人久久| 正在播放亚洲一区| 久久精品亚洲一区二区| 亚洲免费小视频| 欧美激情精品久久久久久变态| 久久国产一区二区三区| 欧美午夜精品理论片a级大开眼界| 欧美国产欧美综合 | 午夜欧美大尺度福利影院在线看 | 亚洲高清在线观看| 国产视频亚洲| 亚洲午夜小视频| 亚洲天堂视频在线观看| 欧美激情一区二区在线| 欧美福利视频在线观看| 国产一区av在线| 亚洲一区二区三区精品在线 | 国产一区二区三区免费观看 | 亚洲欧美中文字幕| 亚洲男人的天堂在线| 欧美日韩午夜| 99re6这里只有精品| 日韩一级在线| 欧美精品123区| 亚洲肉体裸体xxxx137| 亚洲精品视频中文字幕| 欧美国产视频一区二区| 亚洲国产二区| 99国产精品久久久久久久久久 | 国产无遮挡一区二区三区毛片日本| 在线视频一区观看| 亚洲在线不卡| 国产麻豆91精品| 久久精品视频免费| 欧美福利在线| 一本一本大道香蕉久在线精品| 欧美片在线播放| 艳妇臀荡乳欲伦亚洲一区| 亚洲免费在线播放| 国产欧美一区二区三区沐欲| 欧美日韩中文| 久久精品亚洲国产奇米99| 国产一区二区三区不卡在线观看| 亚洲欧美视频在线| 欧美综合77777色婷婷| 韩曰欧美视频免费观看| 另类激情亚洲| 亚洲精品国产精品久久清纯直播| 一区二区三区久久精品| 国产精品一二| 久久只精品国产| 日韩小视频在线观看| 久久精品欧美| 亚洲三级电影全部在线观看高清| 欧美日韩久久| 欧美在线91| 最新成人在线| 性色av一区二区三区| 亚洲国产精品成人综合色在线婷婷| 欧美激情亚洲国产| 欧美一区午夜视频在线观看| 亚洲国产精品高清久久久| 午夜亚洲一区| 亚洲人屁股眼子交8| 国产精品一区免费视频| 免费91麻豆精品国产自产在线观看| 99精品免费视频| 毛片基地黄久久久久久天堂| 一本综合精品| 精品69视频一区二区三区| 欧美日韩一二三区| 美女在线一区二区| 亚洲欧美国产精品va在线观看| 亚洲成色www8888| 亚洲欧美日本国产专区一区| 亚洲福利av| 国产欧美一区二区三区国产幕精品 | 欧美xxxx在线观看| 欧美诱惑福利视频| 在线视频欧美日韩| 亚洲国产成人久久| 老司机午夜精品视频| 欧美一级理论片| 在线视频日韩| 亚洲理伦电影| 亚洲欧洲精品一区二区三区波多野1战4 | 久久久综合精品| 亚洲在线不卡| 一区二区高清| 夜夜嗨av色综合久久久综合网|