程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++拾遺(二)——初窺標准庫類型,拾遺初窺

C++拾遺(二)——初窺標准庫類型,拾遺初窺

編輯:C++入門知識

C++拾遺(二)——初窺標准庫類型,拾遺初窺


  本篇博文的開始,先介紹一道書上看到的智力題:有20瓶藥丸,其中19瓶裝有1克/粒的藥丸,余下一瓶裝有1.1克/粒的藥丸。有一台稱重精准的天平,只是用一次天平的情況下如何找出比較重的那瓶藥丸?

  好了,直接公布答案。從藥瓶#1取出一粒藥丸,從藥瓶#2取出兩粒,從藥瓶#3取出三粒,依此類推。如果每粒藥丸均重1克,則稱得總重量為210克(1 + 2 + … + 20 = 20 * 21 / 2 = 210),“多出來的”重量必定來自每粒多0.1克的藥丸。藥瓶的編號可由算式(weight - 210 grams) / 0.1 grams得出。因此,若這堆藥丸稱得重量為211.3克,則藥瓶#13裝有較重的藥丸。

  各位是否想出了這樣的方法呢(反正我是沒有,哈哈)?

  接下來就直奔主題,本文著重介紹標准庫類型,但不面面俱到,僅以其中兩種最常見的類型string和vector為例,初窺標准庫,其余內容見後續博客。

  標准庫String類型

  • 一個有用的string IO操作:getline。該函數接受兩個參數:一個輸入流對象和一個string對象。getline函數從輸入流的下一行讀取,並保存讀取的內容到string中,但不包括換行符。它並不忽略開頭的換行符。
  • string的size操作返回的是string::size_type類型的值。它是string累類型定義的配套類型(companion type),以達到使庫類型的使用與機器無關(machine-independent),它定義為與unsigned類型有相同含義,且能夠儲存足夠大的string對象的長度。注意,必須加上域操作符表明該類型是由string類定義的,即,size()操作返回string::size_type型,而非int型。
  • 當進行string對象和字符串字面值混合連接操作時,+操作符的左右操作數必須至少有一個是string類型的。
  • string類型通過下標操作符([])來訪問string對象中的單個字符,其類型是size_type。

  標准庫vector類型

  • vector不是一種數據類型,而只是一個類模版,可用來定義任意多種數據類型。
  • vector的成員函數size()返回相應vector類定義的size_type的值,且必須指出該類型是在哪裡定義的。vector類型總是包括vector的元素類型,如:vector<int>::size_type。
  • 下標操作不添加元素,下標只能用於獲取已存在的元素。向vector添加元素,要使用push_back()。

  迭代器簡介

  • 所有的標准庫容器都定義了相應的迭代器類型,只有少數容器支持下標操作,現代C++程序更傾向於使用迭代器。
  • 每種容器都定義了begin和end函數用於返回迭代器。begin返回迭代器指向的第一個元素(如果存在的話),end操作返回指向容器的“末端元素的下一個”,即“超出末端迭代器(off-the-end-iterator)”,用作哨兵。

  為了形象理解如上所述,舉個簡單的例子:讀取一組整數到vector對象,計算首尾配對的元素和並輸出。

 1     vector<int> ivec;
 2     int ival;
 3 
 4     cout << "Enter numbers: " << endl;
 5     while (cin >> ival)
 6         ivec.push_back(ival);
 7 
 8     if (ivec.size() == 0)
 9     {
10         cout << "NO Elemnts!" << endl;
11         return -1;
12     }
13 
14     cout << "Sum of each pair of counterpart elements in the vector: " << endl;
15     
16     vector<int>::size_type cnt = 0;
17     vector<int>::iterator first, last;
18     for (first = ivec.begin, last = ivec.end() - 1; first < last; ++first, --last)
19     {
20         cout << *first + *last << " ";
21         ++cnt;
22         if (cnt % 6 == 0)
23             cout << endl;
24     }
25 
26     if (first == last)
27         cout << endl
28         << "The center element is: "
29         << ivec[first] << endl;    

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved