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 |
任何操作改變了vector的size,那么現有的iterator都會失效。就是說,
先執行vector<int>::iterator iter = ivec.begin()
然后追加element:ivec.add(9);
那么前面的iter就失效了。
3.5 bitset
首先明確這和vector一樣,都是模板template。bitset只有大小的不同。
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位置截取n個bit |
從構造函數可以看出,bitset是指定長度的,這和vector有點不一樣。
從string初始化bitset,要注意的是string和bitset的順序是相反的:就是說從右向左讀string的bit。
例如:
string strval("1100"); bitset<32> bitvec4(strval); |
那么bitvec4的第2位,第3位才是1.即使是對string的截串處理也應保證從右向左讀。
posted on 2009-04-28 16:25 amenglai 閱讀(426) 評論(0) 編輯 收藏 所屬分類: C++ Primer 之 讀書筆記