天天看點

《C++标準程式庫》讀書筆記(二)

,下面這段代碼會引起異常,因為所有權已經轉移,而通過by reference方式傳遞auto_ptr更是糟糕的

若改為: const auto_ptr<int> p(new int);則會在編譯時提示錯誤.是以我們可以通過常數型auto_ptr來終結所有權轉移,它并不是表示你不能更改auto_ptr所擁有的對象,而是不能更改auto_ptr的擁有權,就此特性而言,它比較類似常數指針,而不是指向常數的指針.

複制代碼

template <typename T>

void bad_print(auto_ptr<T> p)

{

    if(p.get()==NULL)

        cout<<"null";

    else

        cout<<*p;

}

int main(int argc, char* argv[])

    auto_ptr<int> p(new int);

    *p = 42;

    bad_print(p);

    *p = 3;

    return 0;

2,auto_ptr之間不能共享擁有權,一個auto_ptr不能指向另一個auto_ptr所擁有的對象,否則當一個指針删除該對象後,就糟糕了.auto_ptr不能指向數組,因為它是通過delete而不是delete[]來釋放其所擁有的對象.它也不是一個引用計數型指針.因為在拷貝和指派後,原來的auto_ptr和新産生的auto_ptr并不相等,而是原auto_ptr會交出擁有權,而不是拷貝給新auto_ptr,是以也不要将auto_ptr作為标準容器的元素.

3,下面重載的輸出運算符的第二個參數是一個const reference,是以并沒有發生擁有權的轉移.

template <class T>

ostream& operator<< (ostream& strm, const auto_ptr<T>& p)

    // does p own an object ?

if (p.get() == NULL) 

        strm << "NULL";         // NO: print NULL

    }

    else {

        strm << *p;             // YES: print the object

    return strm;

4,容器可分為兩類:1)序列式容器,這是ordered collection,每個元素都有固定位置,取決于插入時機和地點,和元素值無關.它們是:vector,deque,list;2)關聯式容器.這是sorted collection,元素位置取決于特定的排序準則,它們是:set,multiset,map,multimap.

關聯式容器自動對其元素排序,并不意味着它們就是用來排序的,這隻疊是它的一個副作用而已.

5,每個容器将其疊代器以嵌套的方式定義于内部,是以各種疊代器的接口相同,類型卻不同.疊代器有以下兩種類型:1)雙向疊代器.可以雙向行進:以遞增運算前進或以遞減運算後退,list,set,multiset,map和multimap提供的疊代器都是此類.2)随機存取疊代器.不僅具備雙向疊代器的所有屬性,還具備随機通路能力.它們提供了”疊代器算術運算”必要的操作符.可以對疊代器增加或減少一個偏移量,處理疊代器之間的距離,或是使用<和>之類的相對關系操作符來比較兩個疊代器.vector,deque和strings所提供的疊代器都屬于此類.為了寫出盡可能與容器類型無關的泛型程式代碼,最好不使用随機存取疊代器的特有操作.

本文轉自Phinecos(洞庭散人)部落格園部落格,原文連結:http://www.cnblogs.com/phinecos/archive/2008/08/19/1270922.html,如需轉載請自行聯系原作者

繼續閱讀