PS,1880后程序員

          看不完的牙,寫不完的程序,跑不完的步。
          隨筆 - 97, 文章 - 34, 評論 - 10, 引用 - 0
          數據加載中……

          C++Primer 讀書筆記 第三章

           

          第三章標準庫類型

          Library Types

          3.1 Namespace

          為什么要用namespace

          namespace就是為了區分重名的類。

          名字空間的主要作用是解決標識符沖突問題。 
           比如C++   Standard   Library就是在名字空間std下,如果沒有名字空間,其中的list就非常可能和自己定義的一些標識符重復。 
           兩種使用方法: 
            1  std::list<int>   myIntList;  
            2、在cpp文件的開頭加上using   namespace   std;  
              這樣在文件中就可以直接使用list<int>   myIntList了。

          3.2 string

          初始化:

          string s1;

          string s2(s1);

          string s3("value");

          string s4(n, 'c');

          讀入string對象,有兩種方式

          1.        使用讀入操作符cin

          cin >> s1 >> s2;

          2.        使用getline()函數

          getline(cin, line)

          輸入操作符會忽略開頭的空格,直至遇到第一個空白字符(leading space)就停止讀入。和輸入操作符不一樣的是,getline() 并不忽略行開頭的換行符。

          String.size()返回的不是int或者unsigned數據類型,而是一個和機器無關的string::size_type,雖然不知道string::size_type的具體類型,但可以肯定的是它一定是unsigned類型。

          string st1, st2 = "The expense of spirit";

          st1 = st2; // 這是兩個對象,replace st1 by a copy of st2

          更加關鍵的是st1 = st2;的執行過程:

          1實際上是把原來分配給st1的空間刪除掉,

          2再分配新的空間,copy過來st2的內容。

          3.3 vector

          vector中包含的必須是統一的數據類型。

          vector不是一種類型,這是一個模板template

          vector并不需要預先分配內存空間。

          初始化:

          vector<T> v1;

          vector<T> v2(v1);

          vector<T> v3(n, i);

          vector<T> v4(n);

          vector的大小

              vector<int> ivec(10,1);

              vector<int>::size_type size = ivec.size();

          tip

          如果要取得vector的大小,要定義數據類型是vector<int>::size_type。這和Java有很大的不同,隨意性很小了。

          3.4 Introducing Iterators

          每個容器類型都會定義自己的迭代類型。

          vector<int>對應的迭代類型就是vector<int>::iterator

          每個容器類型中都會包含一個成員(member),這個成員是容器的迭代器的實際類型。

          只要一種類型實現了迭代器所定義的所有操作,那么這種類型就可以稱為是一個迭代器類型(iterator type)。因此迭代器類型有很多種。

          每種容器類型都定義了對應的iterator類型,但是并不是所有的容器類型都定義下表索引的方式。因此應使用容器訪問容器的單元。

          訪問當前單元的值要使用解引用操作符*,解引用操作符返回的是一個值。

          for (vector<int>::iterator iter = ivec.begin();

                                          iter != ivec.end(); ++iter)

          *iter = 0; //set element to which iter refers to 0

          const_iterator

          我剛開始不是很明白為什么要定義const_iterator類型,后來看了下面的代碼以只讀模式遍歷一個vector,就明白了

          定義:const vector<int>::iterator it

          遍歷:++it

          遍歷:++it //錯誤!

          所以要這樣定義:

          vector<int>::const_iterator it

          遍歷:++it // ok

          // an iterator that cannot write elements

          vector<int>::const_iterator

          // an iterator whose value cannot change

          const vector<int>::iterator

          任何操作改變了vectorsize,那么現有的iterator都會失效。就是說,

          先執行vector<int>::iterator iter = ivec.begin()

          然后追加elementivec.add(9);

          那么前面的iter就失效了。

          3.5 bitset

          首先明確這和vector一樣,都是模板templatebitset只有大小的不同。

          bitset<32> bitvec; // 32 bits, all zero

          bitset初始化

          bitset<n> b;

          bitset<n> b(u);

          bitset<n> b(s);

          bitset<n> b(s, pos, n); //b string 對象 s中含有的位串的副本,從pos位置截取nbit

          從構造函數可以看出,bitset是指定長度的,這和vector有點不一樣。

          string初始化bitset,要注意的是stringbitset的順序是相反的:就是說從右向左讀stringbit

          例如:

          string strval("1100");

          bitset<32> bitvec4(strval);

          那么bitvec4的第2位,第3位才是1.即使是對string的截串處理也應保證從右向左讀

          posted on 2009-04-28 16:25 amenglai 閱讀(426) 評論(0)  編輯  收藏 所屬分類: C++ Primer 之 讀書筆記

          主站蜘蛛池模板: 博湖县| 锡林郭勒盟| 太白县| 彰武县| 洪洞县| 中宁县| 万荣县| 宜宾市| 灵川县| 丰台区| 宜州市| 佛学| 平遥县| 广德县| 新安县| 泾川县| 汉沽区| 友谊县| 泰顺县| 江阴市| 平乡县| 民勤县| 三穗县| 西充县| 上杭县| 德化县| 康保县| 准格尔旗| 双柏县| 蒲江县| 临猗县| 泸溪县| 陵川县| 龙山县| 平定县| 章丘市| 温泉县| 朔州市| 天镇县| 淳安县| 济阳县|