国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++面試八股文:std::vector和std::list,如何選擇?

這篇具有很好參考價值的文章主要介紹了C++面試八股文:std::vector和std::list,如何選擇?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第24面:

面試官:list用過嗎?

二師兄:嗯,用過。

面試官:請講一下list的實現(xiàn)原理。

二師兄:std::list被稱為雙向鏈表,和C中手寫雙向鏈表本質(zhì)上沒有大的區(qū)別。list對象中有兩個指針,一個指向上一個節(jié)點(node),一個指向下一個節(jié)點(node)。

二師兄:與手寫雙向鏈表不同的是,list中有一個base node,此node并不存儲數(shù)據(jù),從C++11開始,此node中包含一個size_t類型的成員變量,用來記錄list的長度。

二師兄:所以說從C++11開始,size()的時間復(fù)雜度是O(1),在此之前是O(N)

面試官:是每個node都包含一個記錄長度的成員變量嗎?

二師兄:不是,GCC中的實現(xiàn)只有在header node上記錄了長度信息,其他node并沒有記錄。

struct _List_node_base
{
    _List_node_base* _M_next;
    _List_node_base* _M_prev;
    ...
};
struct _List_node_header : public _List_node_base
{
#if _GLIBCXX_USE_CXX11_ABI
      std::size_t _M_size;
#endif
...
};

C++面試八股文:std::vector和std::list,如何選擇?

面試官:添加和刪除元素會導(dǎo)致迭代器失效嗎?

二師兄:并不會,因為在任意位置添加和刪除元素只需要改變prev/next指針指向的對象,而不需要移動元素的位置,所以不會導(dǎo)致迭代器失效。

面試官:listvector相比,有哪些優(yōu)勢?什么情況下使用list,什么情況下使用vector

二師兄:主要有2點優(yōu)勢:1.list在隨機插入數(shù)據(jù)不會導(dǎo)致數(shù)據(jù)的搬移。2.list隨機刪除也不會導(dǎo)致數(shù)據(jù)搬移。所以在頻繁的隨機插入/刪除的場景使用list,其他場景使用vector

面試官:你知道std::sort和list成員函數(shù)sort有什么區(qū)別嗎?

二師兄:std::sort是STL算法的一部分。它排序的容器需要有隨機訪問迭代器,所以只能支持vectordeque。list成員函數(shù)sort用于list排序,時間復(fù)雜度是O(N*logN)。

面試官:forward_list了解嗎?知道如何實現(xiàn)的嗎?

二師兄:std::forward_list是C++11引入的新容器之一。它的底層是單向鏈表,引入它的主要目的是為了達到手寫鏈表的性能。同時節(jié)省了部分內(nèi)存空間。(只有一根指針)

C++面試八股文:std::vector和std::list,如何選擇?

面試官:listpop_front/pop_back的時候需要注意哪些問題?

二師兄:需要判斷listsize()不能為0,如果list為空,pop_front/pop_back會導(dǎo)致coredump。

面試官:你知道list的成員函數(shù)insertforward_list的成員函數(shù)的insert_after有什么區(qū)別?

二師兄:兩者都可以向特定位置添加元素。不同的是insert把元素插入到當(dāng)前迭代器前,而insert_after把元素插入到當(dāng)前迭代器后。

面試官:以下代碼的輸出是什么?

#include <iostream>
#include <list>
int main(int argc, char const *argv[])
{
    std::list<int> li = {1,2,3,4,5,6};
    for(auto it = li.begin(); it!= li.end(); ++it)
    {
        if(0 == *it % 2) li.erase(it);
    }
    for(auto& i : li) std::cout << i << " ";
    std::cout << std::endl;
}

二師兄:應(yīng)該是1 3 5。

面試官:遍歷兩個元素數(shù)目相同的vectorlist,哪個效率高?

二師兄:vectorlist的遍歷效率都是O(N),效率應(yīng)該是一樣的。

面試官:好的,回去等通知吧。

讓我們看以下二師兄今日的表現(xiàn):

以下代碼的輸出是什么?

這里實際上會輸出Segmentation fault,原因是因為當(dāng)從listerase這個node,這個nodeprevnext指針被清空,而++it是通過當(dāng)前的nodenext指針去找下一個node,解引用一個空指針,導(dǎo)致coredump。

erase函數(shù)返回下一個有效迭代器,所以可以把if(0 == *it % 2) li.erase(it)修改為if(0 == *it % 2) it = li.erase(it)來解決這個問題。

遍歷兩個元素數(shù)目相同的vectorlist,哪個效率高?

這里二師兄回答的倒是沒有毛病,但是沒有考慮到緩存問題。實際上因為vector底層采用數(shù)組存儲數(shù)據(jù),所以它的空間局部性更好,對緩存更友好(Cache-friendly),所以遍歷vector的效率要高于遍歷list。

最后多啰嗦一點,如果你沒有特別的理由選擇其他容器,使用vector是最好的選擇。

二師兄今日的面試旅程結(jié)束了,感謝各位小伙伴的關(guān)注和點贊。為了保證面試質(zhì)量,以后不一定能保證日更。文章中有任何技術(shù)性問題,請留言反饋,在此感謝!

關(guān)注我,帶你21天“精通”C++?。ü奉^)文章來源地址http://www.zghlxwxcb.cn/news/detail-498361.html

到了這里,關(guān)于C++面試八股文:std::vector和std::list,如何選擇?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C++面試八股文:用過std::set/std::map嗎?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第27面: 面試官:用過 std::set/std::map 嗎? 二師兄:用過。 面試官:能介紹一下二者嗎? 二師兄: std::set 是一個有序的集合,其中的元素是唯一的,即每個元素只能出現(xiàn)一次。一般用于去重和自動排序。 二師兄: std::map 同樣是

    2024年02月11日
    瀏覽(24)
  • C++面試八股文:知道std::unordered_set/std::unordered_map嗎?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第27面: 面試官:知道 std::unordered_set/std::unordered_map 嗎? 二師兄:知道。兩者都是C++11引入的新容器,和 std::set 和 std::map 功能類似, key 唯一, unordered_map 的 value 可變。 二師兄:不同于 set/map , unordered_set/unordered_map 都是無序

    2024年02月11日
    瀏覽(22)
  • C++面試八股文:如何避免死鎖?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第31面: 面試官:什么是鎖?有什么作用? 二師兄:在C++中,鎖(Lock)是一種同步工具,用于保護共享資源,防止多個線程同時訪問,從而避免數(shù)據(jù)競爭和不一致。 面試官:有哪些鎖? 二師兄:從種類上分,可以分為普通鎖、

    2024年02月12日
    瀏覽(28)
  • C++面試八股文:如何實現(xiàn)一個strncpy函數(shù)?

    C++面試八股文:如何實現(xiàn)一個strncpy函數(shù)?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第31面: 面試官: strcpy 函數(shù)使用過吧? 二師兄:用過。 面試官:這個函數(shù)有什么作用? 二師兄:主要用做字符串復(fù)制,將于字符從一個位置復(fù)制到另一個位置。 面試官: strncpy 函數(shù)也使用過吧,和 strcpy 有何不同? 二師兄:

    2024年02月11日
    瀏覽(38)
  • C++面試八股文:如何在堆上和棧上分配一塊內(nèi)存?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位6面: 面試官: 如何在堆上申請一塊內(nèi)存? 二師兄:常用的方法有malloc,new等。 面試官:兩者有什么區(qū)別? 二師兄:malloc是向操作系統(tǒng)申請一塊內(nèi)存,這塊內(nèi)存沒有經(jīng)過初始化,通常需要使用memset手動初始化。而new一般伴隨三個

    2024年02月08日
    瀏覽(24)
  • C++面試八股文:技術(shù)勘誤

    C++面試八股文:技術(shù)勘誤

    不知不覺,《C++面試八股文》已經(jīng)更新30篇了,這是我第一次寫技術(shù)博客,由于個人能力有限,出現(xiàn)了不少紕漏,在此向各位讀者小伙伴們致歉。 為了不誤導(dǎo)更多的小伙伴,以后會不定期的出勘誤文章,請各位小伙伴留意。 在《C++面試八股文:C++中,設(shè)計一個類要注意哪些東

    2024年02月11日
    瀏覽(30)
  • C++面試八股文:什么是RAII?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第13面: 面試官:什么是 RAII ? 二師兄: RAII 是 Resource Acquisition Is Initialization 的縮寫。翻譯成中文是資源獲取即初始化。 面試官: RAII 有什么特點和優(yōu)勢? 二師兄:主要的特點是,在對象初始化時獲取資源,在對象析構(gòu)時釋放

    2024年02月08日
    瀏覽(28)
  • C++面試八股文:聊一聊指針?

    C++面試八股文:聊一聊指針?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第17面: 面試官:聊一聊指針? 二師兄:好的。 面試官:你覺得指針本質(zhì)上是什么? 二師兄:這要從內(nèi)存地址開始說起了。如果有一塊容量是1G的內(nèi)存,假設(shè)它的地址是從 0x00000000 到 0x3fffffff ,每一個字節(jié)都對應(yīng)一個地址。當(dāng)

    2024年02月09日
    瀏覽(24)
  • C++面試八股文:用過STL嗎?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第21面: 面試官:用過STL嗎? 二師兄:(每天都用好嗎。。)用過一些。 面試官:你知道STL是什么? 二師兄:STL是指標準模板庫( Standard Template Library ),是C++區(qū)別于C語言的特征之一。 面試官:那你知道STL的六大部件是什么

    2024年02月09日
    瀏覽(15)
  • C++面試八股文:什么是構(gòu)造函數(shù)?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第29面: 面試官:什么是構(gòu)造函數(shù)? 二師兄:構(gòu)造函數(shù)是一種特殊的成員函數(shù),用于創(chuàng)建和初始化類的對象。構(gòu)造函數(shù)的名稱與類的名稱相同,并且沒有返回類型。構(gòu)造函數(shù)在對象被創(chuàng)建時自動調(diào)用。 面試官:什么是默認構(gòu)造

    2024年02月11日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包