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

ACM___________________________

______________白白の屋
posts - 182, comments - 102, trackbacks - 0, articles - 0
<2010年9月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用鏈接

留言簿(24)

隨筆分類(332)

隨筆檔案(182)

FRIENDS

搜索

積分與排名

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

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

 

定義一個(gè)list

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

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

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

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

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

  使用list的成員函數(shù)push_back和push_front插入一個(gè)元素到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)在有個(gè)4個(gè)字符串在list中。list的成員函數(shù)push_back()把一個(gè)對(duì)象放到一個(gè)list的后面,而 push_front()把對(duì)象放到前面。我通常把一些錯(cuò)誤信息push_back()到一個(gè)list中去,然后push_front()一個(gè)標(biāo)題到list中, 這樣它就會(huì)在這個(gè)錯(cuò)誤消息以前打印它了。

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

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

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

/*
|| 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中的元素

  我們想要遍歷一個(gè)list,比如打印一個(gè)中的所有對(duì)象來看看list上不同操作的結(jié)果。要一個(gè)元素一個(gè)元素的遍歷一個(gè)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;
 } 
}

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

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

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

  在STL編程中,我們?cè)诿總€(gè)算法中都使用一個(gè)或多個(gè)iterator。我們使用它們來存取容器中的對(duì)象。 要存取一個(gè)給定的對(duì)象,我們把一個(gè)iterator指向它,然后間接引用這個(gè)iterator。 

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

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

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

  使用STL list和 iterator,我們要初始化、比較和給iterator增量來遍歷這個(gè)容器。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);
}

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

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

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


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

  讓我們?cè)谝粋€(gè)學(xué)生測(cè)驗(yàn)成績的list中來數(shù)一數(shù)滿分的個(gè)數(shù)。這是一個(gè)整型的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)計(jì)等于某個(gè)值的對(duì)象的個(gè)數(shù)。上面的例子它檢查list中的每個(gè)整型對(duì)象是不是100。每次容器中的對(duì)象等于100,它就給NumberOf100Scores加1。這是程序的輸出: 

There were 2 scores of 100

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

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

  函數(shù)對(duì)象被約定為STL算法調(diào)用operator時(shí)返回true或false。它們根據(jù)這個(gè)來判定這個(gè)函數(shù)。舉個(gè)例子會(huì) 說的更清楚些。count_if()通過傳遞一個(gè)函數(shù)對(duì)象來作出比count()更加復(fù)雜的評(píng)估以確定一個(gè)對(duì)象是否應(yīng)該被 記數(shù)。在這個(gè)例子里我們將數(shù)一數(shù)牙刷的銷售數(shù)量。我們將提交包含四個(gè)字符的銷售碼和產(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;
}

  這是這個(gè)程序的輸出: 

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

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

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

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

 

使用count_if()的一個(gè)更加復(fù)雜的函數(shù)對(duì)象

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

/*
|| 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 這個(gè)例子演示了如何向函數(shù)對(duì)象傳遞信息。你可以定義任意你想要的構(gòu)造函數(shù),你可以再函數(shù)對(duì)象中做任何你 想做的處理,都可以合法編譯通過。 

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

 

Feedback

# re: 標(biāo)準(zhǔn)模板庫(STL)學(xué)習(xí)---List容器 ( 轉(zhuǎn)載 )  回復(fù)  更多評(píng)論   

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

# re: 標(biāo)準(zhǔn)模板庫(STL)學(xué)習(xí)---List容器 ( 轉(zhuǎn)載 )  回復(fù)  更多評(píng)論   

2010-09-01 16:20 by MiYu
呃, 我也不是很清楚 , 我復(fù)制過來了
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩亚洲欧美综合| 国产精品99久久久久久有的能看| 亚洲日本成人在线观看| 欧美一区二区性| 欧美诱惑福利视频| 久久久999精品| 久久久久久久综合| 欧美h视频在线| 91久久精品网| 99国内精品久久| 亚洲制服av| 久久久久成人精品| 欧美~级网站不卡| 欧美激情欧美激情在线五月| 欧美日韩综合视频| 国产精品久久久久影院色老大| 国产精品亚洲精品| 黄色成人免费网站| 亚洲精品视频免费| 亚洲欧美成人| 久久天天综合| 亚洲第一主播视频| 99综合精品| 久久av在线看| 欧美精彩视频一区二区三区| 国产精品久久久久天堂| 好看不卡的中文字幕| 亚洲区在线播放| 亚洲一区在线免费观看| 久久久久99精品国产片| 亚洲成色777777女色窝| 亚洲美女在线看| 欧美亚洲视频一区二区| 免播放器亚洲一区| 国产精品久久国产愉拍| 影音先锋亚洲视频| 99精品99久久久久久宅男| 亚洲女性喷水在线观看一区| 麻豆av福利av久久av| 亚洲美女福利视频网站| 欧美一级片一区| 欧美福利视频网站| 欧美日韩国产成人高清视频| 国产日韩精品一区二区三区| 国产伦精品一区二区三区视频孕妇| 韩国在线一区| 99精品欧美一区| 久久本道综合色狠狠五月| 欧美激情aⅴ一区二区三区| 正在播放欧美一区| 久久一区免费| 国产精品久久久久久久久果冻传媒| 国产又爽又黄的激情精品视频| 亚洲美女视频| 久久天天躁狠狠躁夜夜av| 欧美成人高清视频| 精品福利av| 国产久一道中文一区| 亚洲精品免费一区二区三区| 久久精品国语| 一区二区欧美精品| 欧美暴力喷水在线| 国产亚洲亚洲| 亚洲一区在线视频| 91久久精品www人人做人人爽| 欧美在线观看一区| 国产精品区一区二区三区| 亚洲精品你懂的| 久热爱精品视频线路一| 亚洲一区二区三区久久| 欧美精品在线免费播放| 在线免费观看日本欧美| 久久国产欧美| 一本一本久久a久久精品综合麻豆| 久久尤物视频| 国产日韩欧美高清| 午夜精品电影| 一区二区三区|亚洲午夜| 欧美激情精品久久久久久免费印度| 黄网站免费久久| 久久精品国产免费看久久精品| 一本色道久久综合亚洲精品不卡| 欧美国产日韩在线| 在线精品视频免费观看| 久久久亚洲一区| 亚洲欧美日韩区| 国产精品毛片a∨一区二区三区|国 | 久久九九久精品国产免费直播 | 麻豆久久婷婷| 欧美一乱一性一交一视频| 国产精品久久久91| 亚洲调教视频在线观看| 91久久极品少妇xxxxⅹ软件| 免费成人av| 亚洲二区在线视频| 老牛嫩草一区二区三区日本| 午夜精品亚洲| 国产欧美日韩激情| 欧美一区二区精品在线| 野花国产精品入口| 欧美日韩精品综合| 一区二区三区日韩精品| 亚洲激情二区| 欧美人成在线| 亚洲视频一区二区在线观看 | 久久婷婷丁香| 久久成人精品无人区| 国内自拍亚洲| 老鸭窝亚洲一区二区三区| 另类成人小视频在线| 一区二区三区在线免费播放| 久久一区二区三区国产精品| 久久久7777| 亚洲国产精品嫩草影院| 亚洲高清视频中文字幕| 欧美国产另类| 国产精品99久久久久久久女警| 亚洲日韩成人| 欧美午夜视频网站| 香蕉乱码成人久久天堂爱免费| 亚洲免费在线视频| 国产在线精品自拍| 久久嫩草精品久久久精品| 久久深夜福利| 亚洲看片一区| 亚洲激情不卡| 国产精品久在线观看| 久久精品国产免费观看| 快射av在线播放一区| 亚洲欧洲日本一区二区三区| 亚洲日本中文字幕免费在线不卡| 欧美午夜电影网| 久久不见久久见免费视频1| 久久久久久一区二区三区| 亚洲国产精品va在线看黑人动漫 | 欧美午夜久久| 久久黄色网页| 免费在线看一区| 中日韩视频在线观看| 亚洲在线视频| 在线看视频不卡| 亚洲人成网站色ww在线| 欧美亚男人的天堂| 久热精品在线| 欧美巨乳在线| 久久久精品性| 欧美精品一卡| 欧美诱惑福利视频| 女女同性精品视频| 亚洲影院在线| 久久久久久久久久码影片| 一本色道久久综合精品竹菊 | 亚洲精品在线一区二区| 亚洲视频免费| 在线观看欧美视频| 一本大道久久精品懂色aⅴ| 国产欧美日韩激情| 亚洲高清免费| 国产精品自拍网站| 欧美激情精品久久久久久免费印度| 欧美三级电影网| 久久人人爽人人| 欧美日韩精品免费| 久久夜色精品国产噜噜av| 欧美日韩免费在线视频| 亚洲视频999| 亚洲高清不卡一区| 亚洲曰本av电影| 亚洲三级网站| 欧美一区二区播放| 亚洲色图在线视频| 久久九九免费视频| 新67194成人永久网站| 欧美韩日一区| 麻豆国产精品va在线观看不卡| 欧美午夜精品伦理| 亚洲国产精品va在线观看黑人| 国产日本欧美在线观看| 亚洲欧洲精品一区二区三区不卡| 国产日韩欧美| 宅男精品视频| 99这里只有久久精品视频| 久久人人爽人人| 久久精品2019中文字幕| 欧美午夜国产| 亚洲人成网站精品片在线观看| 一区福利视频| 亚洲在线观看免费| 一道本一区二区| 免费视频亚洲| 久久影视精品| 国产欧美日韩麻豆91| 亚洲人成久久| 亚洲国产精品成人综合色在线婷婷| 一区二区三区高清在线| 91久久久久久久久| 久久国产免费看| 久久www成人_看片免费不卡 | 午夜精品成人在线视频| 欧美乱人伦中文字幕在线|