STL源碼剖析面試問題

  1. 當vector的內存用完了,它是如何動態擴展內存的?它是怎么釋放內存的?用clear可以釋放掉內存嗎?是不是線程安全的?
  • vector內存用完了,會以當前size大小重新申請2* size的內存,然后把原來的元素復制過去,把新元素插上,然后釋放原來的內存。
  • 引用《effective stl》的第十二條:當涉及 STL容器和線程安全性時,你可以指望一個 STL庫允許多個線程同時讀一個容器,以及多個線程對不同的容器做寫入操作。你不能指望 STL庫會把你從手工同步控制中解脫出來,而且你不能依賴于任何線程支持。必須自己去寫多線程安全措施。
  • 一般我們釋放vector里的元素使用clear,其實它不能釋放內存,要想釋放內存要使用swap,這樣:![在這里插入圖片描述]
vector<type> v;
//.... 這里添加許多元素給v
//.... 這里刪除v中的許多元素
vector<type>(v).swap(v);
//此時v的容量已經盡可能的符合其當前包含的元素數量

測試代碼:

#include <iostream>
#include <vector>int main()
{std::vector<int> myvector(100);std::cout << "1. capacity of myvector: " << myvector.capacity() << '\n';myvector.resize(10);std::cout << "2. capacity of myvector: " << myvector.capacity() << '\n';myvector.shrink_to_fit();std::cout << "3. capacity of myvector: " << myvector.capacity() << '\n';return 0;
}

輸出結果:
在這里插入圖片描述

vector

插入操作:

  • 插入(push_back/insert)操作在vector中加入新的元素,但vector中元素總數仍不大于capacity,這時插入位置后的元素都被依次移動到下一個位置,所以插入位置之后的迭代器都會失效。
  • 插入(push_back/insert)操作在vector中加入新的元素,但vector中元素總數大于capacity,這個時候會重新開辟更大的內存空間,將原來的vector中的內容復制到新的vector中,回收原先vector的內存空間。由于新的vector的地址已完全改變,所以原先的所有迭代器都會失效。

刪除操作:

  • 刪除(pop_back/erase)操作在vector中刪除元素,刪除位置后的元素都被依次復制到前一個位置,所以刪除位置之后的迭代器都會失效。

set、map
  • 插入操作:插入操作會申請新的節點空間,然后加入都紅黑樹中,原來的迭代器指向的內存空間都未改變,故不會出現迭代器失效。
  • 刪除操作:刪除操作只會引起被刪除節點的迭代器失效。

參考資料

  1. 《STL源碼剖析》相關面試題總結

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385288.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385288.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385288.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

線程與進程的控制原語對比

線程與進程的控制原語對比 fork pthead_create exit( int ) pthead_exit(void *); wait(int *) pthread_join&#xff08; ,void **&#xff09; 阻塞 ;分離 22 &#xff1b;cancel -1 kill() pthread_cancel(); 取消點(檢查點)&#xff1a;系統調用 getpid() pthrea…

ptmalloc堆內存管理機制(主要討論Linux x86下32位系統)

bin&#xff08;chunk容器&#xff09; ptmalloc將相似大小的 chunk 用雙向鏈表鏈接起來&#xff0c;這樣的一個鏈表被稱為一個 bin。 Ptmalloc 一共維護了 128 個 bin&#xff0c;并使用一個數組來存儲這些 bin&#xff0c;這個數組被成為bin數組。 bin數組結構如下&#xf…

線程屬性的修改

&#xff08;1&#xff09;線程屬性 Linux下線程的屬性是可以根據實際項目需要&#xff0c;進行設置&#xff0c;之前我們討論的線程都是采用線程的默認屬性&#xff0c;默認屬性已經可以解決絕大多數開發時遇到的問題。如我們對程序的性能提出更高的要求那么需要設置線程屬性…

NPTL(Native POSIX Thread Library)

1.NPTL&#xff08;Native POSIX Thread Library&#xff09;為POSIX標準線程庫&#xff0c;查看當前Linux系統的pthread庫&#xff08;線程庫&#xff09;版本的命令為&#xff1a;getconf GNU_LIBPTHREAD_VERSION。 [rootlocalhost 01_pthread_test]# getconf GNU_LIBPTHREA…

線程使用注意事項

1.主線程退出其他線程不退出&#xff0c;主線程應調用pthread_exit&#xff1b; 2.避免僵尸線程&#xff1a;pthread_join、pthread_detach、pthread_create指定分離屬性。被join線程可能在join函數返回前就釋放完自己的所有內存資源&#xff0c;所以不應當返回被回收線程棧中…

線程同步的概念

所謂同步&#xff0c;即同時起步&#xff0c;協調一致。不同的對象&#xff0c;對“同步”的理解方式略有不同。如&#xff0c;設備同步&#xff0c;是指在兩個設備之間規定一個共同的時間參考&#xff1b;數據庫同步&#xff0c;是指讓兩個或多個數據庫內容保持一致&#xff0…

互斥量(mutex)

Linux中提供一把互斥鎖mutex&#xff08;也稱之為互斥量&#xff09;。每個線程在對資源操作前都嘗試先加鎖&#xff0c;成功加鎖才能操作&#xff0c;操作結束解鎖。資源還是共享的&#xff0c;線程間也還是競爭的&#xff0c;但通過“鎖”就將資源的訪問變成互斥操作&#xf…

洗牌算法

參考資料&#xff1a; 1. 洗牌算法匯總以及測試洗牌程序的正確性 2. 三種洗牌算法shuffle

Bloom Filter算法

一、概念 Bloom Filter的中文翻譯叫做布隆過濾器&#xff0c;是1970年由布隆提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數。布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的算法&#xff0c;缺點是有一定的誤…

237. 刪除鏈表中的節點

請編寫一個函數&#xff0c;使其可以刪除某個鏈表中給定的&#xff08;非末尾&#xff09;節點&#xff0c;你將只被給定要求被刪除的節點。 現有一個鏈表 -- head [4,5,1,9]&#xff0c;它可以表示為: 示例 1: 輸入: head [4,5,1,9], node 5 輸出: [4,1,9] 解釋: 給定你鏈表…

151. 翻轉字符串里的單詞

輸入: " hello world! " 輸出: "world! hello" 解釋: 輸入字符串可以在前面或者后面包含多余的空格&#xff0c;但是反轉后的字符不能包括。 示例 3&#xff1a; 輸入: "a good example" 輸出: "example good a" 解釋: 如果兩個單…

進程間同步(互斥量、信號量)

進程間同步可以使用互斥量mutex&#xff08;互斥鎖&#xff09;、信號量和文件鎖。 進程間同步使用信號量&#xff1a; int sem_init(sem_t *sem, int pshared, unsigned int value); 用于進程間同步此時第二個參數不能取0了&#xff0c;取非0值用于進程間同步&#xff0c;一…

1059 Prime Factors(25 分)

Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N p?1???k?1????p?2???k?2?????p?m???k?m????. Input Specification: Each input file contains one test case which gives a…

STL源碼剖析

1. 當vector的內存用完了&#xff0c;它是如何動態擴展內存的&#xff1f;它是怎么釋放內存的&#xff1f;用clear可以釋放掉內存嗎&#xff1f;是不是線程安全的&#xff1f; vector內存用完了&#xff0c;會以當前size大小重新申請2* size的內存&#xff0c;然后把原來的元素…

C++ 內存管理機制

內存分配方式 簡介 在C中&#xff0c;內存分成5個區&#xff0c;他們分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區。 棧&#xff1a;在執行函數時&#xff0c;函數內局部變量的存儲單元都可以在棧上創建&#xff0c;函數執行結束時這些存儲單元自動被釋放。棧內存…

哲學家用餐模型

分析&#xff1a; 為了避免死鎖&#xff0c;做了如下規定&#xff1a;每個哲學家先拿自己左手邊的筷子&#xff0c;然后再去拿右手邊的筷子&#xff0c;如果不能同時得到兩支筷子&#xff0c;則該哲學家放下手中已有的筷子。這種規定依然會因為振蕩而產生死鎖&#xff0c;例如…

【C++ Primer | 16】std::move和std::forward、完美轉發

右值引用應該是C11引入的一個非常重要的技術&#xff0c;因為它是移動語義&#xff08;Move semantics&#xff09;與完美轉發&#xff08;Perfect forwarding&#xff09;的基石&#xff1a; 移動語義&#xff1a;將內存的所有權從一個對象轉移到另外一個對象&#xff0c;高效…

循環引用

1. 測試代碼 #include <iostream> #include <memory> using namespace std;class B; class A { public:shared_ptr<B> pb;~A() { cout << "kill A\n";} };class B { public:shared_ptr<A> pa;~B() { cout << "kill B\n&q…

8. 字符串轉換整數 (atoi)

請你來實現一個 atoi 函數&#xff0c;使其能將字符串轉換成整數。 首先&#xff0c;該函數會根據需要丟棄無用的開頭空格字符&#xff0c;直到尋找到第一個非空格的字符為止。 當我們尋找到的第一個非空字符為正或者負號時&#xff0c;則將該符號與之后面盡可能多的連續數字組…

【C++ Primer | 16】容器適配器全特化、偏特化

上面對模板的特化進行了總結。那模板的偏特化呢&#xff1f;所謂的偏特化是指提供另一份模板定義式&#xff0c;而其本身仍為模板&#xff1b;也就是說&#xff0c;針對模板參數更進一步的條件限制所設計出來的一個特化版本。這種偏特化的應用在STL中是隨處可見的。比如 1.測試…