4 序列式容器

2021-06-19 02:12:30 字數 3329 閱讀 6808

template class vector;
成員函式舉例:注意其中的記憶體管理

void vector::insert(iterator position, size_type n, const t& x)

else

} else

# ifdef __stl_use_exceptions

catch(...)

# endif /* __stl_use_exceptions */

// 以㆘清除並釋放舊的vector

destroy(start, finish); //全域性函式

deallocate();

// 以㆘調整水位標記

start = new_start;

finish = new_finish;

end_of_storage = new_start + len;

} }}

1、list的節點(node)

template struct __list_node;
2、list的迭代器

templatestruct __list_iterator

__list_iterator() {}

__list_iterator(const iterator& x) : node(x.node) {}

bool operator==(const self& x) const

bool operator!=(const self& x) const

// 以㆘對迭代器取值(dereference),取的是節點的資料值。

reference operator*() const

// 以㆘是迭代器的成員訪問(member access)運運算元的標準作法。

pointer operator->() const

// 對迭代器累加1,就是前進㆒個節點

self& operator++()

self operator++(int)

// 對迭代器遞減1,就是後退㆒個節點

self& operator--()

self operator--(int)

};

3、list——實現為乙個環狀雙向列表

template // 預設使用alloc 為配置器

class list

iterator end()

};

4、元素操作

insert, push_front, push_back, erase, pop_front, pop_back, clear, remove, unique, splice, merge, reverse, sort

template void list::unique() 

}

list不能使用stl演算法的sort(),必須使用自己的成員函式sort,因為stl演算法sort()只接受randomaccessiterator。

// 將[first,last) 內的所有元素搬移到position 之前。它是spice(), reserve(), merge()的基礎。

void transfer(iterator position, iterator first, iterator last)

// 「本函式採用quick sort」。這是書中原話,我覺得更像是歸併排序的迭代形式。

template void list::sort()

carry.swap(counter[i]);

if (i == fill) ++fill;

} for (int i = 1; i < fill; ++i)

counter[i].merge(counter[i-1]);

swap(counter[fill-1]);

}

雖然deque也提供random access iterator,但是並不是普通指標,所以盡可能使用vector。對deque進行的排序操作,為了最高效率,可將deque先完整複製到乙個vector上,將vector排序後(利用stl sort演算法),再複製會deque。

1、deque的中控器

deque採用一塊所謂的map(不是stl的map容器),為一小塊連續空間,其中每個元素都是指標,指向較大的連續線性空間(緩衝器),緩衝區才是deque的儲存空間主體。

2、deque的迭代器

template struct __deque_iterator

// 未繼承std::iterator,所以必須自行撰寫五個必要的迭代器相應型別(第3章)

typedef random_access_iterator_tag iterator_category;

typedef t value_type;

typedef ptr pointer;

typedef ref reference;

typedef size_t size_type;

typedef ptrdiff_t difference_type;

typedef t** map_pointer;

typedef __deque_iterator self;

// 保持與容器的聯結

t* cur; // 此迭代器所指之緩衝區㆗的現行(current)元素

t* first; // 此迭代器所指之緩衝區的頭

t* last; // 此迭代器所指之緩衝區的尾(含備用空間)

map_pointer node; // 指向管控㆗心

...};

// 以下實現隨機訪問。迭代器可以直接跳躍n個距離。

self& operator+=(difference_type n)

return *this;

}// 參考 more effective c++, item22: consider using op= instead of

// stand-alone op. a = b + n;

self operator+(difference_type n) const

3、deque的資料結構

STL學習筆記 4 序列式容器之vector

常見的資料結構 array陣列,list鍊錶,tree樹,stack棧,queue佇列,hash table雜湊表,set集合,map對映 根據資料在容器中的排列分為 序列式sequence和關聯式associative。序列式容器之vector array是靜態空間,一旦配置則無法改變 vecto...

STL原始碼分析3 序列式容器

喜歡這篇文章嗎?喜歡的話去看博主的置頂部落格,即可依據分類找到此文章的原版得到更好的體驗,title stl原始碼分析3 序列式容器 mathjax true date 2020 03 24 20 39 33 categories c 筆記,stl原始碼分析 tags c 筆記,stl原始碼分析 k...

C 學習篇 8 序列式容器list

list 個人認為list相當於資料結構裡面的雙向鍊錶,但是實現功能更加複雜。它的好處是每次插入或刪除元素時,就要配置或釋放乙個元素空間,因此,對空間不會產生浪費,對於任何位置的元素插入或刪除是都是o 1 的時間複雜度。list節點 list迭代器 注意 在list中使用erase只會使得當前迭代器...