日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

综合知识点+计算机

發(fā)布時(shí)間:2023/12/4 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 综合知识点+计算机 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

綜合知識(shí)點(diǎn)

多態(tài)性有哪些?(靜態(tài)和動(dòng)態(tài),分別敘述了一下虛函數(shù)和函數(shù)重載)

{
分為靜態(tài)多態(tài)性和動(dòng)態(tài)多態(tài)性,靜態(tài)就是在編譯時(shí)就已經(jīng)確定了,動(dòng)態(tài)是在程序運(yùn)行時(shí)
才能確定。像函數(shù)重載,就是多個(gè)函數(shù)具有相同的函數(shù)名,但是函數(shù)的參數(shù)類型,
個(gè)數(shù),順序必須有所不同。如果基類和派生類成員函數(shù)原型一致,則派生類的成員函數(shù)將覆蓋基類的。
動(dòng)態(tài)多態(tài)性的話像虛函數(shù),在派生類中重新定義虛函數(shù)時(shí),原型必須與基類一致。在程序運(yùn)行
期間,使用一個(gè)基類指針動(dòng)態(tài)地指向基類或派生類的對(duì)象,再調(diào)用虛函數(shù)。
}

動(dòng)態(tài)綁定怎么實(shí)現(xiàn)?(基類與派生類指針和引用的轉(zhuǎn)換問(wèn)題)

{
必須通過(guò)基類的引用或指針進(jìn)行函數(shù)調(diào)用,還必須是虛函數(shù)。那么就會(huì)發(fā)生動(dòng)態(tài)綁定。
}

類型轉(zhuǎn)換有哪些?(四種類型轉(zhuǎn)換)

{
有static_cast,const_cast,dynamic_cast,reinterpret_cast四種,
那么static_cast實(shí)現(xiàn)不同數(shù)據(jù)類型之間的轉(zhuǎn)換,如把int轉(zhuǎn)換為float(寫法是 f=static_cast(i) );
const_cast是取消const屬性,可以將const類型的指針變?yōu)榉莄onst類型的指針
dynamic_cast主要用于基類和派生類之間的轉(zhuǎn)換,會(huì)檢查操作是否有效,不成功的話,指針會(huì)返回null,引用
會(huì)拋出異常。
reinterpret_cast會(huì)對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行重新的解釋,可以進(jìn)行無(wú)關(guān)類型之間的轉(zhuǎn)換,但是很不安全。
}

操作符重載?

{
要用到 operator 關(guān)鍵字,如 bool operator ==(參數(shù)),(如果重載操作符是類成員,則左操作數(shù)必須是該類
的對(duì)象,該操作符才會(huì)被調(diào)用,如果該操作符的左操作數(shù)是其他的類型,則需要被重載為全局名字空間的成員。)
C++中 =(賦值運(yùn)算符),,()(函數(shù)調(diào)用運(yùn)算符),和->(成員指向)必須被定義為類成員操作符。
像成員選擇符(.)、域名解析
操作符(:😃、條件操作符外(?:)不能被重載,重載操作符不能改變他們的操作符優(yōu)先級(jí),
不能改變操作數(shù)的個(gè)數(shù)。
(T& operator ++ ()//前置增量
T& operator ++ (int) //后置增量

}

內(nèi)存對(duì)齊的原則?

{
(1)每一個(gè)數(shù)據(jù)成員的偏移量必須是自身長(zhǎng)度的倍數(shù),像int,則地址必須是4的倍數(shù)。
(2)結(jié)構(gòu)本身也要對(duì)齊,對(duì)齊將按照#pragma pack指定的數(shù)值和結(jié)構(gòu)(或聯(lián)合)最大數(shù)據(jù)成員長(zhǎng)度中,比較小的那個(gè)進(jìn)行
}

模板怎么實(shí)現(xiàn)?

{
格式就是 template<typename 形參名>
定義類模板如 template<class 形參名> ,創(chuàng)建對(duì)象時(shí)如A a;在類模板外定義成員函數(shù)時(shí),
類似void A::func(){},參數(shù)可以是類型形參,非類型形參和模板形參,非模板類型的形參
只能是整型,指針和引用
}

指針和const的用法?

{
最簡(jiǎn)單的指針如 int* p,說(shuō)明p是指向一個(gè)int型數(shù)據(jù)的指針,還有指針數(shù)組,寫法如 int *p[3],代表數(shù)組里的全是指針,還有數(shù)組指針,寫法如 int (*p)[3],指針指向的內(nèi)容是一個(gè)數(shù)組,還有函數(shù)指針,寫法如
int (p)(int); 代表指向的是有一個(gè)int型參數(shù)求且返回值是int的函數(shù)。還有二級(jí)指針。
const聲明變量需要初始化,且不能被修改,如果修飾指針的話,主要有兩種情況,如 const int p這種所指內(nèi)容是常量,不可被修改,另外一種如 int *const p,則指針是常量,所指內(nèi)容可修改。在類中使用的話,可以修飾類的數(shù)據(jù)成員,不能在類中初始化,要在構(gòu)造函數(shù)的初始化列表里初始化。const 可以修飾函數(shù)的參數(shù),
返回值以及整個(gè)函數(shù),參數(shù)可能是指針或引用,則加了const可以保護(hù)其內(nèi)容,一般修飾函數(shù)的話const放在
函數(shù)體后,則函數(shù)不能修改數(shù)據(jù)成員或者調(diào)用其他非const成員函數(shù)。
}

const 和 #define的區(qū)別?

{
編譯器處理方式不同,宏在預(yù)處理階段替換,const在編譯階段替換。類型和安全檢查不同,宏沒(méi)有類型,不做安全
檢查,const有類型,在編譯階段做安全檢查。
}

虛函數(shù)、純虛函數(shù)、析構(gòu)函數(shù)?

{
虛函數(shù)和純虛函數(shù)都要加 virtual 修飾,虛函數(shù)可以直接被使用,也可以被子類重載以后以多態(tài)形式調(diào)用,而
純虛函數(shù)在基類里只有聲明沒(méi)有定義,必須在子類中實(shí)現(xiàn)之后才能被使用。含有純虛函數(shù)的類被稱為抽象類,
純虛函數(shù)后加 =0, 抽象類是不能被實(shí)例化的
析構(gòu)函數(shù)在類名前加~, 當(dāng)對(duì)象的生命周期結(jié)束時(shí),會(huì)自動(dòng)執(zhí)行析構(gòu)函數(shù)。一個(gè)類只能由一個(gè)析構(gòu)函數(shù),不能被
重載。static局部對(duì)象在函數(shù)調(diào)用結(jié)束時(shí)對(duì)象并不釋放,只在main函數(shù)結(jié)束或調(diào)用exit函數(shù)結(jié)束程序時(shí),才調(diào)用
static 局部對(duì)象的析構(gòu)函數(shù)。全局對(duì)象同理,如果是用new 動(dòng)態(tài)建立的,當(dāng)用delete釋放該對(duì)象時(shí),先調(diào)用該對(duì)象
的析構(gòu)函數(shù)。
}

內(nèi)聯(lián)函數(shù)(內(nèi)聯(lián)函數(shù)的優(yōu)點(diǎn)以及和宏定義的區(qū)別)

{
內(nèi)聯(lián)函數(shù)相當(dāng)于自動(dòng)地用函數(shù)的形式添加進(jìn)代碼,可以提高效率。編譯器會(huì)對(duì)內(nèi)聯(lián)函數(shù)的參數(shù)做安全檢查或自動(dòng)類型轉(zhuǎn)換,
而宏定義不會(huì)。內(nèi)聯(lián)函數(shù)可以訪問(wèn)類的私有成員變量,而宏定義則不能,在類中聲明同時(shí)定義的成員函數(shù),自動(dòng)轉(zhuǎn)化為
內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)中復(fù)雜的操作,如循環(huán)和遞歸調(diào)用將不被關(guān)聯(lián)。
}

typedef 的用法

{
它與#define有些類似,但有不同。typedef定義一種類型的別名,而不是簡(jiǎn)單的宏替換,可以幫助結(jié)構(gòu)體定義別名,
用typedef來(lái)定義與平臺(tái)無(wú)關(guān)的類型。比如定義一個(gè)REAL的浮點(diǎn)類型,如果在支持long double 的平臺(tái)上,可以將long double
定義別名REAL,在不支持long double的平臺(tái)上,再改成 typedef double REAL。
}

c語(yǔ)言和c++有什么區(qū)別?

{
C是面向過(guò)程,C++是面向?qū)ο?br /> 最突出的部分是多了類的概念,由此衍生出封裝,繼承,重載,多態(tài)等。封裝有點(diǎn)像結(jié)構(gòu)體,但是結(jié)構(gòu)體不能定義變量的訪問(wèn)
權(quán)限,結(jié)構(gòu)體也不能被繼承,C++可以實(shí)現(xiàn)運(yùn)算符的重載。
C++引入了模板,使得C++可以實(shí)現(xiàn)泛型編程。
   待補(bǔ)充。。。
}

二叉樹的非遞歸遍歷代碼?
void PreOrderVisit(Node* root) {MyStack K;K.Init();Node* p=root;while(p!=NULL||!K.Empty()){while(p!=NULL){Visit(p->data);K.Push(p);p=p->lchild;}if(!K.Empty()){p=K.Pop();p=p->rchild;}} } void InOrderVisit(Node* root) {MyStack K;K.Init();Node* p=root;while(p!=NULL||!K.Empty()){while(p!=NULL){K.Push(p);p=p->lchild;}if(!K.Empty()){p=K.Pop();Visit(p->data);p=p->rchild;}} } void LastOrderVisit(Node* root)//設(shè)置一個(gè)標(biāo)記,到第二次訪問(wèn)時(shí)才輸出 {MyStack K;K.Init();Node* p=root;Node* temp=NULL;while(p!=NULL||!K.Empty()){while(p!=NULL){p->IsFirst=true;K.Push(p);p=p->lchild;}if(!K.Empty()){temp=K.Pop();if(temp->IsFirst==true){temp->IsFirst=false;K.Push(temp);p=temp->rchild;}else{Visit(temp->data);p=NULL;}}} }
繼承機(jī)制中對(duì)象之間是如何轉(zhuǎn)換的?

{
從派生類向基類的類型轉(zhuǎn)換只對(duì)指針和引用類型有效。基類向派生類不存在隱式類型轉(zhuǎn)換,使用dynamic_cast
}

繼承機(jī)制中引用和指針之間如何轉(zhuǎn)換?

{
基類向派生類轉(zhuǎn)換,用dynamic_cast轉(zhuǎn)換,首先檢查基類指針是否真正指向一個(gè)派生類對(duì)象,再做相應(yīng)處理,成功
返回派生類對(duì)象,失敗則返回空指針。派生類向基類轉(zhuǎn)換,可以用dynamic_cast或者直接進(jìn)行類型轉(zhuǎn)換。
}

虛函數(shù)、虛函數(shù)表里面內(nèi)存如何分配?

{
對(duì)于無(wú)虛函數(shù)覆蓋的繼承:虛函數(shù)按照其聲明順序放在虛函數(shù)表中;父類的虛函數(shù)在其子類的虛函數(shù)的前面。 對(duì)于
有虛函數(shù)覆蓋的繼承:派生類中起覆蓋作用的虛函數(shù)放在原基類虛函數(shù)的位置;沒(méi)有被覆蓋的虛函數(shù)依舊。 對(duì)于無(wú)
虛函數(shù)覆蓋的多重繼承:每個(gè)父類都有自己的虛函數(shù)表;派生類的虛函數(shù)被放在了第一個(gè)父類的虛函數(shù)表中(按照聲
明順序排序)。 對(duì)于有虛函數(shù)覆蓋的多重繼承:派生類中起覆蓋作用的虛函數(shù)放在原基類虛函數(shù)的位置;沒(méi)有被覆
蓋的虛函數(shù)依舊。
}

如何實(shí)現(xiàn)只能動(dòng)態(tài)分配類對(duì)象、不能定義類對(duì)象?

{
把類的構(gòu)造函數(shù)和析構(gòu)函數(shù)設(shè)為protected屬性。類對(duì)象不能訪問(wèn),但是派生類可以繼承,也可以訪問(wèn)。
同時(shí),創(chuàng)建create和destroy兩個(gè)函數(shù),用于創(chuàng)建類對(duì)象。
(create函數(shù)設(shè)為static,原因是,創(chuàng)建對(duì)象的時(shí)候A *p=A::create().只有靜態(tài)成員函數(shù)才能有類名直接訪問(wèn))
}

紅黑樹的定義和解釋?

{
一棵紅黑樹是指一棵滿足下述性質(zhì)的二叉搜索樹(BST, binary search tree):

  • 每個(gè)結(jié)點(diǎn)或者為黑色或者為紅色。
  • 根結(jié)點(diǎn)為黑色。
  • 每個(gè)葉結(jié)點(diǎn)(實(shí)際上就是NULL指針)都是黑色的。
  • 如果一個(gè)結(jié)點(diǎn)是紅色的,那么它的兩個(gè)子節(jié)點(diǎn)都是黑色的(也就是說(shuō),不能有兩個(gè)相鄰的紅色結(jié)點(diǎn))。
  • 對(duì)于每個(gè)結(jié)點(diǎn),從該結(jié)點(diǎn)到其所有子孫葉結(jié)點(diǎn)的路徑中所包含的黑色結(jié)點(diǎn)數(shù)量必須相同。
  • 紅黑樹,一種二叉查找樹,但在每個(gè)結(jié)點(diǎn)上增加一個(gè)存儲(chǔ)位表示結(jié)點(diǎn)的顏色,可以是Red或Black。通過(guò)對(duì)任何一條
    從根到葉子的路徑上各個(gè)結(jié)點(diǎn)著色方式的限制,紅黑樹確保沒(méi)有一條路徑會(huì)比其他路徑長(zhǎng)出倆倍,因而是接近平衡的。
    前面說(shuō)了,紅黑樹,是一種二叉查找樹,既然是二叉查找樹,那么它必滿足二叉查找樹的一般性質(zhì)。
    紅黑樹是通過(guò)節(jié)點(diǎn)分為紅、黑兩種顏色并根據(jù)一定的規(guī)則確保在一定程度上是平衡的,從而保證在紅黑樹中查找、
    刪除、插入操作都只需要O(logk)的時(shí)間。
    }

    靜態(tài)成員函數(shù)和數(shù)據(jù)成員又什么意義?

    {
    A 聲明為static的類成員或者成員函數(shù)便能在類的范圍內(nèi)共同享,類域中的全局變量。
    B 派生類對(duì)象與基類對(duì)象共享基類的靜態(tài)數(shù)據(jù)成員。
    D 靜態(tài)數(shù)據(jù)成員不能在類定義里邊初始化,只能在class body外初始化。
    E 靜態(tài)成員函數(shù)沒(méi)有this指針,它不能返回非靜態(tài)成員,因?yàn)槌藢?duì)象會(huì)調(diào)用它外,類本身也可以調(diào)用。靜態(tài)
    成員函數(shù)不可以調(diào)用類的非靜態(tài)成員。因?yàn)殪o態(tài)成員函數(shù)不含this指針。
    F 非靜態(tài)成員函數(shù)可以任意地訪問(wèn)靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員。
    }

    explicit是干什么用的?

    {
    這個(gè)關(guān)鍵字的作用是將編譯器隱式轉(zhuǎn)換的功能給屏蔽掉。
    }

    模板特化的概念,為什么特化?

    {
    通常又有一些特殊的情況,不能直接使用泛型模板展開(kāi)實(shí)現(xiàn),所以要用到模板特化
    一是特化為絕對(duì)類型;比如特化為 double,float 等
    template<>
    class Compare{};
    二是特化為引用,指針類型;比如 const T*,const T& ;
    template
    class Compare<T*>{};
    三是特化為另外一個(gè)類模板。
    template
    struct SpecializedType
    {
    T1 x1;
    T1 x2;
    };
    template
    class Compare<SpecializedType >{};
    對(duì)于特殊類型, 比如說(shuō)指針, 其拷貝就和基本數(shù)據(jù)類型不同. 這是為了處理這種特殊情況就需要類模板特化,
    用于處理特定類型的特殊情況.
    }

    strcpy函數(shù)的編寫?
    char *strcpy(char *strDes,const char *strSrc){assert(strSrc!=NULL);char *p=strDes;while(*strSrc!='\0'){*p++=*strSrc++;}*p='\0';return strDes;}
    strcpy返回類型是干嘛用的?

    {
    當(dāng)strcpy失敗的時(shí)候就能從返回值判斷出來(lái)。
    有時(shí)候函數(shù)原本不需要返回值,但為了增加靈活性如支持鏈?zhǔn)奖磉_(dá),可以附加返回值。
    方便嵌套使用
    }

    strcpy和memcpy的區(qū)別

    {
    復(fù)制的內(nèi)容不同。strcpy只能復(fù)制字符串,而memcpy可以復(fù)制任意內(nèi)容,例如字符數(shù)組、整型、結(jié)構(gòu)體、類等。
    復(fù)制的方法不同。strcpy遇到被復(fù)制字符的串結(jié)束符"\0"才結(jié)束,memcpy則是根據(jù)其第3個(gè)參數(shù)決定復(fù)制的長(zhǎng)度。
    }

    一個(gè)由C/C++編譯的程序占用的內(nèi)存有幾個(gè)部分?

    {
    棧區(qū)(stack)—由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
    堆區(qū)(heap)— 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由OS 。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,
    分配方式倒是類似于鏈表。
    全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,
    未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。 - 程序結(jié)束后有系統(tǒng)釋放
    文字常量區(qū) —常量字符串就是放在這里的。 程序結(jié)束后由系統(tǒng)釋放
    程序代碼區(qū)—存放函數(shù)體的二進(jìn)制代碼。
    }

    棧區(qū)和堆區(qū)的區(qū)別?

    {
    棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5?br /> 最大容量是系統(tǒng)預(yù)先規(guī)定好的,在 WINDOWS下,棧的大小是2M(也有的說(shuō)是1M,總之是一個(gè)編譯時(shí)就確定的常數(shù)),
    如果申請(qǐng)的空間超過(guò)棧的剩余空間時(shí),將提示overflow。因此,能從棧獲得的空間較小。
    堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來(lái)存儲(chǔ)的空閑內(nèi)存地址的,自然是
    不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見(jiàn),
    堆獲得的空間比較靈活,也比較大。
    }

    內(nèi)存泄露

    {
    內(nèi)存泄漏(memory leak)指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況。內(nèi)存泄漏并非指內(nèi)存在
    物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計(jì)錯(cuò)誤,失去了對(duì)該段內(nèi)存的控制,因而造成了內(nèi)存的浪費(fèi)。
    一般我們常說(shuō)的內(nèi)存泄漏是指堆內(nèi)存的泄漏。堆內(nèi)存是指程序從堆中分配的,大小任意的(內(nèi)存塊的大小可以在程序
    運(yùn)行期決定),使用完后必須顯式釋放的內(nèi)存
    }

    內(nèi)存溢出有哪些因素?

    {
    (1) 使用非類型安全(non-type-safe)的語(yǔ)言如 C/C++ 等,不檢查數(shù)組越界,也不檢查類型安全。
    (2) 以不可靠的方式存取或者復(fù)制內(nèi)存緩沖區(qū),超過(guò)緩沖區(qū)長(zhǎng)度大小之類的。
    (3) 編譯器設(shè)置的內(nèi)存緩沖區(qū)太靠近關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。
    }

    new 和 malloc的區(qū)別,delete和free的區(qū)別?

    {
    malloc與free是C++/C語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(shù),new/delete是C++的運(yùn)算符。
    簡(jiǎn)而言之 new/delete能進(jìn)行對(duì)對(duì)象進(jìn)行構(gòu)造和析構(gòu)函數(shù)的調(diào)用進(jìn)而對(duì)內(nèi)存進(jìn)行更加詳細(xì)的工作,而malloc/free不能。
    malloc在申請(qǐng)內(nèi)存的時(shí)候,必須要提供申請(qǐng)的長(zhǎng)度,而返回的指針是void*型,必須要強(qiáng)轉(zhuǎn)才能成為需要的類型。
    這是因?yàn)閚ew 內(nèi)置了sizeof、類型轉(zhuǎn)換和類型安全檢查功能。
    對(duì)于用戶自定義的對(duì)象而言,用maloc/free無(wú)法滿足動(dòng)態(tài)管理對(duì)象的要求。
    }

    為什么要用static_cast轉(zhuǎn)換而不用c語(yǔ)言中的轉(zhuǎn)換?

    {
    Static_cast轉(zhuǎn)換,它會(huì)檢查類型看是否能轉(zhuǎn)換,有類型安全檢查。
    }

    異常機(jī)制怎么回事?

    {
    try ,throw ,catch ,拋出異常用throw,捕獲異常用catch.
    如果沒(méi)有找到處理代碼,程序就調(diào)用C++標(biāo)準(zhǔn)庫(kù)中定義的函數(shù)terminate()。
    terminate()的缺省行為是調(diào)用abort() ,指示從程序非正常退出。
    }

    迭代器刪除元素會(huì)發(fā)生什么?

    {
    對(duì)于vector和string,指向其刪除點(diǎn)之后位置的迭代器、引用和指針都會(huì)失效。 對(duì)于deque,刪除除首尾位置之
    外的任何元素都會(huì)使所有迭代器、引用和指針失效。 對(duì)于list,指向容器其他位置的迭代器,引用和指針仍有效。
    對(duì)于插入操作,影響與刪除操作一樣。
    }

    vector中的reserve函數(shù)和resize函數(shù)的區(qū)別?

    {
    reserve并不改變?nèi)萜鲀?nèi)實(shí)際元素?cái)?shù)量,它僅影響vector預(yù)先分配多大的內(nèi)存空間,而且只有當(dāng)需要的內(nèi)存空間
    超過(guò)當(dāng)前容量時(shí),reserve調(diào)用才會(huì)改變vector的容量,此時(shí)一般將容量擴(kuò)充1倍; resize只改變?nèi)萜髦性氐?br /> 數(shù)目,而不是容器的容量。
    }

    必須在構(gòu)造函數(shù)初始化里進(jìn)行初始化的數(shù)據(jù)成員又哪些?

    {
    對(duì)象成員的初始化,const修飾的成員的初始化,引用成員的初始化,子類調(diào)用父類的構(gòu)造函數(shù)初始化父類成員
    }

    auto_ptr類

    {
    auto_ptr 是C++標(biāo)準(zhǔn)庫(kù)提供的類模板,auto_ptr對(duì)象通過(guò)初始化指向由new創(chuàng)建的動(dòng)態(tài)內(nèi)存,它是這塊內(nèi)存的
    擁有者,一塊內(nèi)存不能同時(shí)被分給兩個(gè)擁有者。當(dāng)auto_ptr對(duì)象生命周期結(jié)束時(shí),其析構(gòu)函數(shù)會(huì)將auto_ptr對(duì)
    象擁有的動(dòng)態(tài)內(nèi)存自動(dòng)釋放。避免內(nèi)存泄露,即使發(fā)生異常,通過(guò)異常的棧展開(kāi)過(guò)程也能將動(dòng)態(tài)內(nèi)存釋放。
    auto_ptr不支持new 數(shù)組。
    2. auto_ptr需要包含的頭文件 #include
    int* p = new int(33);
    auto_ptr api§;
    可以利用已經(jīng)存在的智能指針來(lái)構(gòu)造新的智能指針
    因?yàn)橐粔K動(dòng)態(tài)內(nèi)存智能由一個(gè)智能指針獨(dú)享,所以在拷貝構(gòu)造或賦值時(shí)都會(huì)發(fā)生擁有權(quán)轉(zhuǎn)移的過(guò)程。
    防止兩個(gè)auto_ptr對(duì)象擁有同一個(gè)對(duì)象(一塊內(nèi)存)
    警惕智能指針作為參數(shù)!
    auto_ptr不能初始化為指向非動(dòng)態(tài)內(nèi)存
    auto_ptr常用的成員函數(shù):
    1) get() 返回auto_ptr指向的那個(gè)對(duì)象的內(nèi)存地址。
    2) reset() 重新設(shè)置auto_ptr指向的對(duì)象。類似于賦值操作,但賦值操作不允許將一個(gè)普通指針指直接
    賦給auto_ptr,而reset()允許
    3) release() 返回auto_ptr指向的那個(gè)對(duì)象的內(nèi)存地址,并釋放對(duì)這個(gè)對(duì)象的所有權(quán)。
    1、auto_ptr不能共享所有權(quán)。
    2、auto_ptr不能指向數(shù)組
    3、auto_ptr不能作為容器的成員。
    4、不能通過(guò)賦值操作來(lái)初始化auto_ptr,這是因?yàn)閍uto_ptr 的構(gòu)造函數(shù)被定義為了explicit
    5、不要把a(bǔ)uto_ptr放入容器
    }

    shared_ptr類

    {
    boost::shared_ptr可以共享對(duì)象的所有權(quán),也可以使用在stl的容器中
    boost::shared_ptr的管理機(jī)制其實(shí)并不復(fù)雜,就是對(duì)所管理的對(duì)象進(jìn)行了引用計(jì)數(shù),
    當(dāng)新增一個(gè)boost::shared_ptr對(duì)該對(duì)象進(jìn)行管理時(shí),就將該對(duì)象的引用計(jì)數(shù)加一;
    減少一個(gè)boost::shared_ptr對(duì)該對(duì)象進(jìn)行管理時(shí),就將該對(duì)象的引用計(jì)數(shù)減一,
    如果該對(duì)象的引用計(jì)數(shù)為0的時(shí)候,說(shuō)明沒(méi)有任何指針對(duì)其管理,才調(diào)用delete釋放其所占的內(nèi)存。
    }

    求二叉樹最近公共祖先

    {
    其實(shí)嘛,首先數(shù)一下兩個(gè)結(jié)點(diǎn)的深度,然后比較深的那個(gè)往上走(深-淺)步,最后同時(shí)往上走,
    肯定會(huì)命中最近共同父節(jié)點(diǎn)的。
    這棵樹如果自己實(shí)現(xiàn)就加個(gè)父指針,從當(dāng)前節(jié)點(diǎn)向上走到根節(jié)點(diǎn),這條路沿路節(jié)點(diǎn)做一下標(biāo)記,然后從第2個(gè)
    節(jié)點(diǎn)向上走,第一次遇到曾經(jīng)標(biāo)記過(guò)的節(jié)點(diǎn)就是最近公共祖先,一直走到根節(jié)點(diǎn)都沒(méi)遇到就屬于不同的兩棵樹。
    }

    鏈表反轉(zhuǎn)
    //為了反轉(zhuǎn)這個(gè)單鏈表,我們先讓頭結(jié)點(diǎn)的next域指向結(jié)點(diǎn)2,再讓結(jié)點(diǎn)1的next域指向結(jié)點(diǎn)3,最后將結(jié) //點(diǎn)2的next域指向結(jié)點(diǎn)1,就完成了第一次交換,順序就變成了Header-結(jié)點(diǎn)2-結(jié)點(diǎn)1-結(jié)點(diǎn)3-結(jié)點(diǎn)4-NULL,然后進(jìn)行 //相同的交換將結(jié)點(diǎn)3移動(dòng)到結(jié)點(diǎn)2的前面,然后再將結(jié)點(diǎn)4移動(dòng)到結(jié)點(diǎn)3的前面就完成了反轉(zhuǎn), List* ReverseList(List* L) {List *temp=NULL;List *p=NULL;if(L==NULL)return NULL;temp=L->next;while(temp->next!=NULL){p=temp->next;temp->next=p->next;p->next=L->next;L->next=p;}return L; }
    鏈表排序
    struct Node {int key;Node* next;Node(int _key,int _next):key(_key),next(_next){} }; Node* GetPartion(Node* st,Node* en) {int key=st->key;Node* p=st;Node* q=p->next;while(q!=en){if(q->key<key){p=p->next;swap(p->key,q->key);}q=q->next;}swap(p->key,st->key);return p; } void QuickSort(Node* st,Node* en) {if(st!=en){Node* p=GetPartion(st,en);QuickSort(st,p);QuickSort(p->next,en);} }
    面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別

    {
    面向過(guò)程就是分析出解決問(wèn)題所需要的步驟,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn)。
    面向?qū)ο笫前褬?gòu)成問(wèn)題事務(wù)分解成各個(gè)對(duì)象,對(duì)外界來(lái)說(shuō),事物是直接使用的,不用去管他內(nèi)部的情況。
    面向?qū)ο蠛兔嫦蜻^(guò)程的主要區(qū)別就是數(shù)據(jù)是單獨(dú)存儲(chǔ)還是與操作存儲(chǔ)在一起。對(duì)面向過(guò)程而言,數(shù)據(jù)是獨(dú)立的。
    而在面向?qū)ο笾?#xff0c;對(duì)象本身就提供了存儲(chǔ)數(shù)據(jù)的空間(類的數(shù)據(jù)成員),這樣就是函數(shù)的參數(shù)傳遞簡(jiǎn)單多了,
    而且提供了數(shù)據(jù)封裝后,數(shù)據(jù)的訪問(wèn)也變可靠了。
    待補(bǔ)充。。。
    }

    手寫kMP

    {
    原理:kmp算法是找到一個(gè)字符串模板在另一個(gè)字符串中的所有匹配點(diǎn),首先預(yù)處理出模板每個(gè)位置的失配指針,用自己匹配自己,計(jì)算f每一個(gè)位置之前的字符串的前綴和后綴公共部分的最大長(zhǎng)度。然后就是匹配   的過(guò)程。

    void GetFail(const char* P,int* fail){int L=strlen(P);fail[0]=fail[1]=0;for(int i=1;i<L;i++){int j=fail[i];while(j&&P[j]!=P[i]) j=fail[j];fail[i+1]=(P[i]==P[j]?j+1:0);}}void KMP(char* T,char* P,int* fail){int L1=strlen(T);int L2=strlen(P);GetFail(P,fail);int j=0;for(int i=0;i<L1;i++){while(j&&P[j]!=T[i]) j=fail[j];if(P[j]==T[i]) j++;if(j==L2) printf("%d\n",i-L2+1);}}

    }

    快排的時(shí)間復(fù)雜度,最差是多少,最好是多少

    {
    對(duì)于劃分成子問(wèn)題求解的問(wèn)題,我們可以用下面的公式
    T(n) = a*T(n/b)+f(n) 來(lái)求得其時(shí)間復(fù)雜度,如果a=b = 2 時(shí),即每次劃分都是按照折半劃分,那么其時(shí)間復(fù)雜度
    是0(nlogn),但是我們考慮另外一種極端的情況,就是每次劃分都是
    T(n) = T(n-1)+T(1)+f(n),這就是我們平時(shí)說(shuō)的有序的情況,這樣其實(shí)就退化成0(n2).
    }

    堆和棧的區(qū)別

    {
    棧區(qū)是由編譯器自動(dòng)分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),
    是一塊連續(xù)的內(nèi)存的區(qū)域。
    堆區(qū)一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由OS回收 。堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),
    是不連續(xù)的內(nèi)存區(qū)域。
    }

    死鎖

    {
    所謂死鎖是指多個(gè)進(jìn)程因競(jìng)爭(zhēng)資源而造成的一種僵局(互相等待),若無(wú)外力作用,這些進(jìn)程都將無(wú)法向前推進(jìn)。

    產(chǎn)生死鎖必須同時(shí)滿足以下四個(gè)條件

    {
    互斥條件:進(jìn)程要求對(duì)所分配的資源(如打印機(jī))進(jìn)行排他性控制,即在一段時(shí)間內(nèi)某 資源僅為一個(gè)進(jìn)程所占有。
    不剝奪條件:進(jìn)程所獲得的資源在未使用完畢之前,不能被其他進(jìn)程強(qiáng)行奪走
    請(qǐng)求和保持條件:進(jìn)程已經(jīng)保持了至少一個(gè)資源,但又提出了新的資源請(qǐng)求,而該資源 已被其他進(jìn)程占有,此時(shí)請(qǐng)求
    進(jìn)程被阻塞,但對(duì)自己已獲得的資源保持不放
    循環(huán)等待條件:存在一種進(jìn)程資源的循環(huán)等待鏈,
    }

    }

    檢測(cè)死鎖和避免死鎖的方法

    {
    有序資源分配法
    銀行家算法是從當(dāng)前的狀態(tài)S出發(fā),逐個(gè)檢查各申請(qǐng)者中誰(shuí)獲得資源能完成其工作,
    然后假定其完成工作且歸還全部資源,再進(jìn)一步檢查誰(shuí)又獲得資源能完成其工作,
    若所有申請(qǐng)者均能完成工作,則系統(tǒng)狀態(tài)是安全的。
    }

    sizeof和strlen

    {
    (1)sizeof是算符,strlen是函數(shù)。
    (2)sizeof可以用類型做參數(shù),strlen只能用char*做參數(shù),且必須是以"\0"結(jié)尾的。
    sizeof在編譯時(shí)計(jì)算,因此sizeof不能用來(lái)返回動(dòng)態(tài)分配的內(nèi)存空間的大小。實(shí)際上,
    用sizeof來(lái)返回類型以及靜態(tài)分配的對(duì)象、結(jié)構(gòu)或數(shù)組所占的空間,返回值跟對(duì)象、結(jié)構(gòu)、數(shù)組所存儲(chǔ)的內(nèi)容沒(méi)有關(guān)系
    strlen在運(yùn)行時(shí)計(jì)算,返回字符串的長(zhǎng)度。該字符串可能是自己定義的,也可能是內(nèi)存中隨機(jī)的,該函數(shù)實(shí)際完成的功
    能是從代表該字符串的第一個(gè)地址開(kāi)始遍歷,直到遇到結(jié)束符NULL。
    }

    TCP三次握手和四次揮手的過(guò)程

    {
    ACK TCP報(bào)頭的控制位之一,對(duì)數(shù)據(jù)進(jìn)行確認(rèn).確認(rèn)由目的端發(fā)出,用它來(lái)告訴發(fā)送端這個(gè)序列號(hào)之前的數(shù)據(jù)段
    都收到了
    SYN 同步序列號(hào),TCP建立連接時(shí)將這個(gè)位置1
    FIN 發(fā)送端完成發(fā)送任務(wù)位,當(dāng)TCP完成數(shù)據(jù)傳輸需要斷開(kāi)時(shí),提出斷開(kāi)連接的一方將這位置1

    三次握手:首先A向B發(fā)送連接請(qǐng)求,同步位SYN置1,冰選擇一個(gè)序號(hào)x,進(jìn)入同步發(fā)送狀態(tài),這次第一次握手
    B收到連接請(qǐng)求之后,如果同意連接,向B發(fā)送確認(rèn),SYN和ACK位都置1,確認(rèn)號(hào)ack=x+1,同時(shí)為自己選擇一個(gè)序號(hào)y
    進(jìn)入同步收到狀態(tài),這是第二次握手。
    A收到B的確認(rèn)以后,還要給B確認(rèn),ACK置1,確認(rèn)號(hào)ack=y+1,自己的序號(hào)變?yōu)閤+1,TCP連接建立,這是第三次握手。

    四次揮手:
    當(dāng)主機(jī)A完成數(shù)據(jù)傳輸后,將控制位FIN置1,提出停止TCP連接的請(qǐng)求
    主機(jī)B收到FIN后對(duì)其作出響應(yīng),確認(rèn)這一方向上的TCP連接將關(guān)閉,將ACK置1
    由B 端再提出反方向的關(guān)閉請(qǐng)求,將FIN置1
    主機(jī)A對(duì)主機(jī)B的請(qǐng)求進(jìn)行確認(rèn),將ACK置1,雙方向的關(guān)閉結(jié)束.

    為什么要三次握手,四次揮手?

    {
    次握手完成兩個(gè)重要的功能,既要雙方做好發(fā)送數(shù)據(jù)的準(zhǔn)備工作(雙方都知道彼此已準(zhǔn)備好),
    也要允許雙方就初始序列號(hào)進(jìn)行協(xié)商,這個(gè)序列號(hào)在握手過(guò)程中被發(fā)送和確認(rèn)。
    因?yàn)門CP連接是全雙工的(即數(shù)據(jù)可在兩個(gè)方向上同時(shí)傳遞)所以進(jìn)行關(guān)閉時(shí)每個(gè)方向上都要單獨(dú)進(jìn)行關(guān)閉
    }
    }

    TCP和UDP的區(qū)別

    {
    (1)TCP是面向連接的傳輸控制協(xié)議,而UDP提供了無(wú)連接的數(shù)據(jù)報(bào)服務(wù);
    (2)TCP具有高可靠性,確保傳輸數(shù)據(jù)的正確性,不出現(xiàn)丟失或亂序;UDP在傳輸數(shù)據(jù)前不建立連接,不對(duì)數(shù)據(jù)報(bào)進(jìn)行
    檢查與修改,無(wú)須等待對(duì)方的應(yīng)答,所以會(huì)出現(xiàn)分組丟失、重復(fù)、亂序,應(yīng)用程序需要負(fù)責(zé)傳輸可靠性方面的所有工作;
    (3)也正因?yàn)橐陨咸卣?#xff0c;UDP具有較好的實(shí)時(shí)性,工作效率較TCP協(xié)議高;
    (4)UDP段結(jié)構(gòu)比TCP的段結(jié)構(gòu)簡(jiǎn)單,因此網(wǎng)絡(luò)開(kāi)銷也小。
    }

    atoi函數(shù)的實(shí)現(xiàn)

    {
    將字符串轉(zhuǎn)化為數(shù)字
    1. 字符串前的空白
    2. 字符串所表示數(shù)值的正負(fù)號(hào)
    3. 結(jié)束條件,遇到非數(shù)字或者字符’\0’結(jié)束
    4. 考慮溢出,分別與int值所能表示的最大(0x7fffffff)和最小值(0x8000000)進(jìn)行比較
    5. 考慮異常輸入情況下,用全局變量valid來(lái)標(biāo)識(shí),對(duì)于"+/-" “0” "+abc"需要進(jìn)行區(qū)分

    #define INT_MAX ((int)0x7FFFFFFF) typedef long long LL; bool valid; int MyAtoi(const char* str) {bool tag=false;LL ret=0;valid=false;if(str==NULL) return 0;while(*str==' ') str++;if(*str=='-'){ tag=true; str++; }else if(*str=='+') str++;if(*str<'0'||*str>'9') return 0;valid=true;while(*str>='0'&&*str<='9'){ret=ret*10+(*str-'0');if((tag&&ret>INT_MAX+1LL)||(!tag&&ret>INT_MAX)){valid=false;return 0;}str++;}if(tag) ret*=-1;return (int)ret; }

    }

    緩沖區(qū)溢出漏洞,越界漏洞

    {
    使用像strcpy這類不安全函數(shù),這種函數(shù)對(duì)用戶的輸入不作任何檢查,分配的內(nèi)存空間是有限的,
    如果輸入超長(zhǎng)的字符串,必然會(huì)導(dǎo)致溢出。
    緩沖區(qū)溢出中,最為危險(xiǎn)的是堆棧溢出,因?yàn)槿肭终呖梢岳枚褩R绯?#xff0c;在函數(shù)返回時(shí)改變返回程序的地址,
    讓其跳轉(zhuǎn)到任意地址,帶來(lái)的危害一種是程序崩潰導(dǎo)致拒絕服務(wù),另外一種就是跳轉(zhuǎn)并且執(zhí)行一段惡意代碼
    }

    線程和進(jìn)程的區(qū)別

    {
    簡(jiǎn)而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程.
    線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高。
    另外,進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。
    線程在執(zhí)行過(guò)程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。
    但是線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。
    從邏輯角度來(lái)看,多線程的意義在于一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。但操作系統(tǒng)并沒(méi)有將多
    個(gè)線程看做多個(gè)獨(dú)立的應(yīng)用,來(lái)實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線程的重要區(qū)別。
    線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位.線程自己基本
    上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個(gè)
    進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.
    如果我們把進(jìn)程比喻為一個(gè)運(yùn)行在電腦上的軟件,那么一個(gè)軟件的執(zhí)行不可能是一條邏輯執(zhí)行的,必定有多個(gè)分
    支和多個(gè)程序段,就好比要實(shí)現(xiàn)程序A,實(shí)際分成 a,b,c等多個(gè)塊組合而成。
    }

    C++11 的特性

    {
    1、 初始化列表應(yīng)用更廣泛
    2、 auto的引入,foreach循環(huán)
    3、 ???????C++ 11 中的Lambda表達(dá)式用于定義并創(chuàng)建匿名的函數(shù)對(duì)象,以簡(jiǎn)化編程工作。
    4、 C++11 還增加了防止基類被繼承和防止子類重寫函數(shù)的能力.這是由特殊的標(biāo)識(shí)符final來(lái)完成的
    5、 C++11 通過(guò)引入一個(gè)新的關(guān)鍵字nullptr充當(dāng)單獨(dú)的空指針常量,可以隱式轉(zhuǎn)換任意類型的指針或指向成員的指針的類型,
    6、 constexpr:constexpr可以說(shuō)是對(duì)const變量的擴(kuò)展,它只是約束const變量的右側(cè)的式子必須能在編譯時(shí)就能算出值
    待補(bǔ)充。。。
    }

    B+樹和B-樹

    {

    B-樹

    {
    非葉子結(jié)點(diǎn)的關(guān)鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
    非葉子結(jié)點(diǎn)的指針:P[1], P[2], …, P[M];其中P[1]指向關(guān)鍵字小于K[1]的
    子樹,P[M]指向關(guān)鍵字大于K[M-1]的子樹,其它P[i]指向關(guān)鍵字屬于(K[i-1], K[i])的子樹;
    B-樹的搜索,從根結(jié)點(diǎn)開(kāi)始,對(duì)結(jié)點(diǎn)內(nèi)的關(guān)鍵字(有序)序列進(jìn)行二分查找,如果
    命中則結(jié)束,否則進(jìn)入查詢關(guān)鍵字所屬范圍的兒子結(jié)點(diǎn);重復(fù),直到所對(duì)應(yīng)的兒子指針為
    空,或已經(jīng)是葉子結(jié)點(diǎn);任何一個(gè)關(guān)鍵字出現(xiàn)且只出現(xiàn)在一個(gè)結(jié)點(diǎn)中;
    }

    B+樹

    {
    非葉子結(jié)點(diǎn)的子樹指針與關(guān)鍵字個(gè)數(shù)相同;
    非葉子結(jié)點(diǎn)的子樹指針P[i],指向關(guān)鍵字值屬于[K[i], K[i+1])的子樹
    為所有葉子結(jié)點(diǎn)增加一個(gè)鏈指針;
    所有關(guān)鍵字都出現(xiàn)在葉子結(jié)點(diǎn)的鏈表中(稠密索引),且鏈表中的關(guān)鍵字恰好是有序的;
    不可能在非葉子結(jié)點(diǎn)命中;
    非葉子結(jié)點(diǎn)相當(dāng)于是葉子結(jié)點(diǎn)的索引(稀疏索引),葉子結(jié)點(diǎn)相當(dāng)于是存儲(chǔ)
    (關(guān)鍵字)數(shù)據(jù)的數(shù)據(jù)層;
    }
    }

    C++內(nèi)存管理

    {
    在C++中,內(nèi)存分成5個(gè)區(qū),他們分別是堆、棧、自由存儲(chǔ)區(qū)、全局/靜態(tài)存儲(chǔ)區(qū)和常量存儲(chǔ)區(qū)。
      棧,在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。
    棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。
      堆,就是那些由new分配的內(nèi)存塊,他們的釋放編譯器不去管,由我們的應(yīng)用程序去控制,一般一個(gè)new就要對(duì)應(yīng)
    一個(gè)delete。如果程序員沒(méi)有釋放掉,那么在程序結(jié)束后,操作系統(tǒng)會(huì)自動(dòng)回收。
      自由存儲(chǔ)區(qū),就是那些由malloc等分配的內(nèi)存塊,他和堆是十分相似的,不過(guò)它是用free來(lái)結(jié)束自己的生命的。
      全局/靜態(tài)存儲(chǔ)區(qū),全局變量和靜態(tài)變量被分配到同一塊內(nèi)存中,在以前的C語(yǔ)言中,全局變量又分為初始化的和
    未初始化的,在C++里面沒(méi)有這個(gè)區(qū)分了,他們共同占用同一塊內(nèi)存區(qū)。
      常量存儲(chǔ)區(qū),這是一塊比較特殊的存儲(chǔ)區(qū),他們里面存放的是常量,不允許修改。
    }

    extern用法

    {
    在源文件A里定義的函數(shù),在其它源文件里是看不見(jiàn)的(即不能訪問(wèn))。為了在源文件B里能調(diào)用這個(gè)函數(shù),
    應(yīng)該在B的頭部加上一個(gè)外部聲明 用到關(guān)鍵字extern,主要是全局變量和函數(shù)。
    extern "C"的主要作用就是為了能夠正確實(shí)現(xiàn)C++代碼調(diào)用其他C語(yǔ)言代碼。加上extern "C"后,
    會(huì)指示編譯器這部分代碼按C語(yǔ)言的進(jìn)行編譯,而不是C++的。
    }

    無(wú)序數(shù)組找出第K大的數(shù)

    {
    方法一:快速排序,因?yàn)槊看尾僮?#xff0c;以某個(gè)數(shù)為基準(zhǔn),它之前的數(shù)都<=它,之后的數(shù)都>=它,每次遞歸根據(jù)
    判斷只需去找一邊。
    方法二:二分[最小數(shù),最大數(shù)],然后做統(tǒng)計(jì),最后推出那個(gè)數(shù)
    方法三:先建立一個(gè)K個(gè)數(shù)的最大堆,然后判斷是否要替換堆頂?shù)闹怠?br /> 方法四:如果數(shù)的方位不是很大,可以用一個(gè)計(jì)數(shù)數(shù)組計(jì)數(shù)每個(gè)數(shù)出現(xiàn)的次數(shù),最后從小到大掃一遍。
    }

    最大堆的代碼實(shí)現(xiàn)
    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; void HeapAdjust(int *data,int id,int L) {while(id*2+1<L){int nid=id*2+1;if(id*2+2<L){if(data[id*2+2]>data[id*2+1])nid=id*2+2;}if(data[id]<data[nid]){swap(data[id],data[nid]);id=nid;}else break;} } void HeapSort(int* data,int L) {for(int i=L/2-1;i>=0;i--) HeapAdjust(data,i,L);for(int i=L-1;i>0;i--){swap(data[i],data[0]);HeapAdjust(data,0,i);} } int main() {int data[]={3,2,5,6,4,7,8,1};HeapSort(data,8);for(int i=0;i<8;i++) printf("%d ",data[i]);puts("");return 0; }
    hashtable和hashmap的區(qū)別

    {
    HashMap不是線程安全的,HashTable是線程安全的
    hastmap是一個(gè)接口 是map接口的子接口,是將鍵映射到值的對(duì)象,其中鍵和值都
    是對(duì)象,并且不能包含重復(fù)鍵,但可以包含重復(fù)值。HashMap允許null key和null value,
    而hashtable不允許。
    最大的不同是,Hashtable的方法是Synchronize(同步)的,而HashMap不是
    }

    string和stringbuffer的區(qū)別

    {
    String類對(duì)象為不可變對(duì)象,一旦你修改了String對(duì)象的值,隱性重新創(chuàng)建了一個(gè)新的對(duì)象,
    釋放原String對(duì)象,StringBuffer類對(duì)象為可修改對(duì)象,可以通過(guò)append()方法來(lái)修改值
    String類對(duì)象的性能遠(yuǎn)不如StringBuffer類。
    }

    JVM內(nèi)存模型

    {
    1. 程序計(jì)數(shù)器,用來(lái)選取下一條要執(zhí)行的指令
    2. Java虛擬機(jī)棧,用于存儲(chǔ)局部變量表、操作棧、動(dòng)態(tài)鏈接、方法出口等信息
    3. 本地方法棧,而本地方法棧則是為虛擬機(jī)使用到的Native(一個(gè)Native Method就是一個(gè)java調(diào)用非java代碼的接口。)
    方法服務(wù)
    4. Java 堆,所有的對(duì)象實(shí)例以及數(shù)組都要在堆上分配
    5. 方法區(qū),是各個(gè)線程共享的內(nèi)存區(qū)域,它用于存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后
    的代碼等數(shù)據(jù)
    }

    給出一個(gè)鏈表,判斷是否有環(huán)

    {
    p每次走一步,q每次走2步,這樣如果存在循環(huán)節(jié),我們假設(shè)循環(huán)節(jié)長(zhǎng)度為m,那么肯定存在一個(gè)整數(shù)i
    使得(p+i)%m=(q+2*i)%m,這樣我們就可以判斷是否存在循環(huán)節(jié)了。
    }

    個(gè)數(shù)中找重復(fù)數(shù)字

    {
    對(duì)所有的數(shù)據(jù)進(jìn)行異或運(yùn)算,最后的結(jié)果就是重復(fù)的數(shù)字
    因?yàn)?到99都存在,因此可以對(duì)所有的數(shù)組求和然后減去(1+2+3……+99),最后的結(jié)果就是重復(fù)的數(shù)字。
    類似于哈希的方法,記錄每個(gè)數(shù)據(jù)出現(xiàn)的次數(shù)或者來(lái)標(biāo)記是否出現(xiàn)過(guò),如果在遍歷數(shù)組的工程中發(fā)現(xiàn)某個(gè)數(shù)據(jù)已經(jīng)出現(xiàn)過(guò),
    則該數(shù)字就是所求的重復(fù)數(shù)字。
    }

    有一個(gè)長(zhǎng)度為100數(shù)組,里面的數(shù)字從0到99,其中有2個(gè)數(shù)字重復(fù),請(qǐng)找出重復(fù)的那個(gè)數(shù)。

    {
    記錄每個(gè)數(shù)據(jù)出現(xiàn)的次數(shù)或者來(lái)標(biāo)記是否出現(xiàn)過(guò),如果在遍歷數(shù)組的工程中發(fā)現(xiàn)某個(gè)數(shù)據(jù)已經(jīng)出現(xiàn)過(guò),
    則該數(shù)字就是所求的重復(fù)數(shù)字。
    假設(shè)a重復(fù)了2次,b缺失,則數(shù)組求和以后減去(1+2+3+……+99)以后得到的就是a-b的值,同時(shí)對(duì)數(shù)組求
    平方和然后減去(11+22+……+9999)得到aa-b*b的值,然后解方程組可以得到a的值,同時(shí)也可以得到b的值。
    }

    HTTP中Get和Post的區(qū)別

    {
    GET請(qǐng)求的數(shù)據(jù)會(huì)附在URL之后,以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連,
    POST把提交的數(shù)據(jù)則放置在是HTTP包的包體中。
    GET的URL會(huì)有長(zhǎng)度上的限制,則POST的數(shù)據(jù)則可以非常大。
    POST比GET安全,因?yàn)閿?shù)據(jù)在地址欄上不可見(jiàn)。
    }

    給你n個(gè)不重復(fù)的整數(shù),隨機(jī)找出m個(gè)不重復(fù)的整數(shù),要求時(shí)間和空間復(fù)雜度都是O(m)

    {
    把取出來(lái)的數(shù)與后面交換,再在前面的數(shù)中隨機(jī)取
    }

    自我介紹(一分鐘版本和三分鐘版本)

    家庭情況
    為什么不考研
    你為什么想做研發(fā)(相關(guān)崗位的工作)?(以C/C++研發(fā)工程師為例)
    以后的職業(yè)規(guī)劃?
    最大的優(yōu)點(diǎn)和缺點(diǎn)
    你對(duì)這個(gè)崗位的理解
    你有什么想問(wèn)我的?
    {
    對(duì)新人會(huì)怎么進(jìn)行培養(yǎng)?
    我進(jìn)去之后會(huì)做什么?
    就我之前的表現(xiàn)來(lái)看,您覺(jué)得我表現(xiàn)得好與壞的地方有哪些?
    主要用到什么技術(shù)?

    }

    判斷倆個(gè)鏈表是否相交

    {
    如果它們相交,則最后一個(gè)結(jié)點(diǎn)一定是共有的,則只需要判斷最后一個(gè)結(jié)點(diǎn)是否相同即可。
    時(shí)間復(fù)雜度為O(len1+len2)。對(duì)于相交的第一個(gè)結(jié)點(diǎn),則可求出兩個(gè)鏈表的長(zhǎng)度,然后用長(zhǎng)的減去短的得到一
    個(gè)差值 K,然后讓長(zhǎng)的鏈表先遍歷K個(gè)結(jié)點(diǎn),然后兩個(gè)鏈表再開(kāi)始比較。
    }

    判斷倆個(gè)鏈表是否相交,如果鏈表可能有環(huán)列?

    {
    1.先判斷帶不帶環(huán)
    2.如果都不帶環(huán),就判斷尾節(jié)點(diǎn)是否相等
    3.如果都帶環(huán),判斷一鏈表上倆指針相遇的那個(gè)節(jié)點(diǎn),在不在另一條鏈表上。
    如果在,則相交,如果不在,則不相交。
    //判斷鏈表是否有環(huán)

    bool IsLoop(node *head, node **firstLoop, node **lastNode) {node *first = head;node *second = head;if(NULL == head || NULL == head->next){return false;}do{first = first->next; //first走一步second = second->next->next; //second走兩步}while(second && second->next && first != second);if(first == second){*firstLoop = first; //保存環(huán)的首節(jié)點(diǎn)return true;}else{*lastNode = first->next; //保存尾節(jié)點(diǎn)//printf("%d\n", first->next->data);return false;}return false; } //判斷兩鏈表是否相交 //1.如果都不帶環(huán),就判斷尾節(jié)點(diǎn)是否相等 //2.如果都帶環(huán),判斷一鏈表上倆指針相遇的那個(gè)節(jié)點(diǎn),在不在另一條鏈表上。 bool IsCross(node *head1, node *head2) {node *firstLoop1 = NULL;node *firstLoop2 = NULL;node *lastNode1 = NULL;node *lastNode2 = NULL;if(NULL == head1 || NULL == head2){printf("Link is Empty!\n");exit(1);}bool isLoop1 = IsLoop(head1, &firstLoop1, &lastNode1);bool isLoop2 = IsLoop(head2, &firstLoop2, &lastNode2);if(!isLoop1 && !isLoop2) //兩個(gè)都無(wú)環(huán){return (lastNode1 == lastNode2);}else if(isLoop1 != isLoop2) //一個(gè)有環(huán),另一個(gè)無(wú)環(huán){return false;}else //兩個(gè)都有環(huán),判斷環(huán)里的節(jié)點(diǎn)是否能到達(dá)另一個(gè)鏈表環(huán)里的節(jié)點(diǎn){node *temp = firstLoop1->next;while(temp != firstLoop1){if(temp == firstLoop2) //判斷第二個(gè)鏈表里的環(huán)節(jié)點(diǎn)是否在第一個(gè)鏈表中return true;temp = temp->next;}}return false; }

    }

    判斷整數(shù)序列是不是二元查找樹的后序遍歷結(jié)果
    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; bool dfs(const int a[],int l,int r) {if(l>=r)return true;int x=l;while(a[r]>a[x])x++;for(int i=x; i<r; i++)if(a[i]<a[r])return false;if(!dfs(a,l,x-1))return false;if(!dfs(a,x,r-1))return false;return true; } int main() {int a[]= {5,7,6,9,11,10,8};if(!dfs(a,0,6))printf("No\n");elseprintf("Yes\n");return 0; }
    翻轉(zhuǎn)句子中單詞的順序
    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=105; void Reverse(char *S,int x,int y) {while(x<y){swap(S[x],S[y]);x++;y--;} } void Rev(char *S) {int len=strlen(S);Reverse(S,0,len-1);int l=0,r=0;while(l<len){if(S[l]==' '){l++;r++;continue;}else if(S[r]==' '||S[r]=='\0'){Reverse(S,l,r-1);l=++r;}elser++;} } int main() {char S[maxn];while(gets(S)!=NULL){Rev(S);printf("%s\n",S);}return 0; }
    常用庫(kù)函數(shù)
    int strcmp(const char *s,const char *t) {assert(s!=NULL&&t!=NULL);while(*s&&*t&&*s==*t){s++;t++;}return (*s-*t); } char* strcat(char *strDes,const char *strSrc) {assert(strDes!=NULL&&strSrc!=NULL);char *address=strDes;while(*strDes!='\0')strDes++;while((*strDes++=*strSrc++)!='\0');return address; } void memcpy(void *dest,const void *src,unsigned int count) {assert((dest != NULL) && (src != NULL));void *address = dest;while(count--){*(char *)dest=*(char *)src;dest=(char *)dest+1;src=(char *)src+1;}return address; } int memcmp(const void *s,const void *t,unsigned int count) {assert(s!=NULL&&t!=NULL);while(*(char *)s&&*(char *)t&&*(char *)s==*(char *)t&&count--){s=(char *)s+1;t=(char *)t+1;}return (*(char *) s - *(char *) t); } void *memset(void *str, int c, unsigned int count) {assert(str != NULL);void *s = str;while (count --){*(char *) s = (char) c;s = (char *) s + 1;}return str; }
    把二元查找樹轉(zhuǎn)變成排序的雙向鏈表
    #include<cstdio> #include<cstring> using namespace std; struct Node {int v;Node* l;Node* r; }; Node* head=NULL; Node* index=NULL; void ListLink(Node* t) {t->l=index;if(index==NULL)head=t;elseindex->r=t;index=t;printf("%d ",t->value); } void InOrderBSTree(Node* t) {if(t==NULL)return;if(t->l!=NULL)InOrderBSTree(t->l);ListLink(t);if(t->r!=NULL)InOrderBSTree(t->r); } int main() {return 0; }
    查找單向鏈表中倒數(shù)第K個(gè)節(jié)點(diǎn)

    {
    設(shè)置兩個(gè)指針,第一個(gè)先走K+1 步,第二個(gè)指針不動(dòng),然后再一起走,直到第一個(gè)指針走到鏈表末尾。
    }

    字符串的賦值運(yùn)算符重載
    String& operator = (const String& str) {if(this==&str)return *this;if(data!=NULL)delete []data;data=new char[strlen(str)+1];strcpy(data,str.data);return *this; }
    從尾到頭輸出鏈表

    {
    1.遞歸
    2.用棧維護(hù)
    }

    O(1)時(shí)間刪除鏈表節(jié)點(diǎn)

    {
    把下一個(gè)結(jié)點(diǎn)值拷貝到該節(jié)點(diǎn),實(shí)際刪除下一個(gè)結(jié)點(diǎn)。如果該節(jié)點(diǎn)是尾節(jié)點(diǎn),則遍歷鏈表刪除。時(shí)間復(fù)雜度O(1)
    }

    找出數(shù)組中兩個(gè)只出現(xiàn)一次的數(shù)字

    {
    全部異或一遍,必然得到不為0的值,找到該值第一個(gè)為1的位,然后根據(jù)數(shù)組中的數(shù)是否該位上有1分成兩組,在分別
    找出答案。
    }

    在字符串中刪除特定的字符

    {
    設(shè)置兩個(gè)指針p,q,p指向的是刪除的字符則跳過(guò),否則把p指向的字符賦值給q,然后兩個(gè)同時(shí)向前走一步。
    }

    內(nèi)存泄漏 怎么處理

    {
    良好的編碼習(xí)慣,盡量在涉及內(nèi)存的程序段,檢測(cè)出內(nèi)存泄露。
    使用智能指針
    直接重載C++ new操作符,實(shí)現(xiàn)垃圾回收。初始化一個(gè)內(nèi)存池,當(dāng)內(nèi)存池滿的時(shí)候,進(jìn)行垃圾回收操作。
    }

    指針和引用的區(qū)別

    {
    指針:指針是一個(gè)變量,只不過(guò)這個(gè)變量存儲(chǔ)的是一個(gè)地址,指向內(nèi)存的一個(gè)存儲(chǔ)單元;而引用跟原來(lái)的變
    量實(shí)質(zhì)上是同一個(gè)東西,只不過(guò)是原變量的一個(gè)別名而已
    指針的值可以為空,但是引用的值不能為NULL,并且引用在定義的時(shí)候必須初始化;
    可以有const指針,但是沒(méi)有const引用
    }

    C++析構(gòu)函數(shù)為什么要為虛函數(shù)

    {
    在實(shí)現(xiàn)多態(tài)時(shí),當(dāng)用基類操作派生類,在析構(gòu)時(shí)防止只析構(gòu)基類而不析構(gòu)派生類的狀況發(fā)生。避免內(nèi)存泄露
    }

    STL內(nèi)存分配

    {
    當(dāng)用戶用new構(gòu)造一個(gè)對(duì)象的時(shí)候,其實(shí)內(nèi)含兩種操作:1)調(diào)用::operator new申請(qǐng)內(nèi)存;2)調(diào)用該對(duì)象的構(gòu)造函數(shù)構(gòu)造此對(duì)象的內(nèi)容
    當(dāng)用戶用delete銷毀一個(gè)對(duì)象時(shí),其實(shí)內(nèi)含兩種操作:1)調(diào)用該對(duì)象的析構(gòu)函數(shù)析構(gòu)該對(duì)象的內(nèi)容;2)調(diào)用::operator delete釋放內(nèi)存
    }

    map的迭代器失效問(wèn)題

    {
    刪除一個(gè)元素之后不能用++,迭代器失效了,可以使迭代器指向刪除之后重新調(diào)整容器的下一個(gè)位置。
    }

    LRU算法
    const int maxn=5; struct LRU { private:int Size;int stk[maxn]; public:bool IsEmpty(){return Size==0;}bool IsFull(){return Size==maxn-1;}int IndexOfValue(int v){for(int i=0; i<Size; i++)if(v==stk[i])return i;return -1;}void Push(int v){int id=IndexOfValue(v);if(!IsFull()&&id==-1){stk[id++]=v;}else if(IsFull()&&id==-1){for(int i=0; i<Size-1; i++)stk[i]=stk[i+1];stk[Size-1]=v;}else{for(int i=id; i<Size-1; i++)stk[i]=stk[i+1];stk[Size-1]=v;}} };
    迭代器與指針的區(qū)別

    {
    迭代器返回的是對(duì)象引用而不是對(duì)象的值,不能直接輸出迭代器自身的值
    指針能指向函數(shù)而迭代器不行,迭代器只能指向容器
    }

    多繼承的優(yōu)缺點(diǎn)

    {
    多重繼承的優(yōu)點(diǎn)很明顯,就是對(duì)象可以調(diào)用多個(gè)基類中的接口
    如果派生類所繼承的多個(gè)基類有相同的基類,而派生類對(duì)象需要調(diào)用這個(gè)祖先類的接口方法,就會(huì)容易出現(xiàn)二義性。
    }

    函數(shù)模板和模板函數(shù)的區(qū)別?

    {
    函數(shù)模塊是這個(gè)模塊的定義,模板函數(shù)是這個(gè)函數(shù)的實(shí)例化
    }

    虛函數(shù)的底層實(shí)現(xiàn)機(jī)制

    {
    在每一個(gè)含有虛函數(shù)的類對(duì)象中,都含有一個(gè)VPTR,指向虛函數(shù)表。
    }

    將字符串中所有小寫字母放在前面,大寫字母放在后面
    void GetSort(char *S) {int len=strlen(S);for(int i=len-1; i>=1; i--){if(isupper(S[i]))continue;int j=i;while(j>=0&&islower(S[j]))j--;if(j<0)break;char temp=S[j];for(int k=j; k<i; k++)S[k]=S[k+1];S[i]=temp;} }
    http和https的區(qū)別

    {
    http是超文本傳輸協(xié)議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協(xié)議
    http和https使用的是完全不同的連接方式用的端口也不一樣,前者是80,后者是443。
    http的連接很簡(jiǎn)單,是無(wú)狀態(tài)的
    HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議 要比http協(xié)議安全
    }

    http請(qǐng)求報(bào)文格式

    {
    一個(gè)HTTP請(qǐng)求報(bào)文由請(qǐng)求行(request line)、請(qǐng)求頭部(header)、空行和請(qǐng)求數(shù)據(jù)4個(gè)部分組成
    請(qǐng)求行由請(qǐng)求方法字段、URL字段和HTTP協(xié)議版本字段3個(gè)字段組成
    請(qǐng)求頭部由關(guān)鍵字/值對(duì)組成,每行一對(duì),
    }

    cookie

    {
    Cookie 是一小段文本信息,伴隨著用戶請(qǐng)求和頁(yè)面在 Web 服務(wù)器和瀏覽器之間傳遞。
    因?yàn)镠TTP協(xié)議是無(wú)狀態(tài)的,對(duì)于一個(gè)瀏覽器發(fā)出的多次請(qǐng)求,WEB服務(wù)器無(wú)法區(qū)分 是不是來(lái)源于同一個(gè)瀏覽器。
    常用來(lái)存儲(chǔ)用戶ID
    }

    printf參數(shù)的執(zhí)行順序

    {
    printf()函數(shù)的參數(shù),在printf()函數(shù)讀取時(shí)是從左往右讀取的,然后將讀取到的參數(shù)放到棧里面去,最后讀取
    到的就放在棧頂,處理參數(shù)的時(shí)候是從棧頂開(kāi)始的,所以是從右邊開(kāi)始處理的
    }

    條件:有無(wú)刻度的5L和3L兩個(gè)杯子
    要求:必須在不使用第三個(gè)杯子的前提下得到4L水

    {
      方法1:把5L的杯子裝滿水,用它倒?jié)M3L的杯子
      然后再把3L杯子里的水倒掉
      把5L杯子里剩下的水(也就是5L-3L=2L)倒入3L杯子
      再把5L的杯子裝滿水然后用5L的杯子把3L的杯子裝滿
      這樣,5L的杯子里就剩下4L水了

    方法2:把3L的杯子裝滿水,倒入5L杯子里
      再次裝滿3L的杯子,倒入5L的杯子里
      倒?jié)M時(shí)3L的杯子里剩下1L水
      然后把這1L水倒入5L杯子里
      接著再次把3L杯子裝滿,倒入5L杯子
      這樣,5L的杯子里就有4L水了
    }

    給定一個(gè)先升序后降序的數(shù)組 , 從這個(gè)數(shù)組 中查找一個(gè)給定的元素 是否存在

    {
    先利用三分找到最大值,然后再兩段中查找
    }

    位運(yùn)算實(shí)現(xiàn)加法

    {
    方法一: 我的思路主要是利用a+1 的位運(yùn)算就是最左端(從第0位開(kāi)始向左)連續(xù)的1變?yōu)?,原先a中為0的位置最低那一位變?yōu)?。

    int Add(int a,int b) {for(int i = 1; i; i <<= 1)if(b & i)for(int j = i; j; j <<= 1)if(a & j) a &= ~j;else {a |= j; break;}return a; }

    方法二:

    int Add(int a,int b) {if(b == 0)return a;//沒(méi)有進(jìn)位的時(shí)候完成運(yùn)算int sum,carry;sum = a ^ b;//完成第一步?jīng)]有進(jìn)位的加法運(yùn)算carry=(a & b) << 1;//完成第二步進(jìn)位并且左移運(yùn)算return Add(sum,carry);//進(jìn)行遞歸,相加 }

    }

    位運(yùn)算實(shí)現(xiàn)乘法
    int Mul(int a,int b) {int ans = 0;for(int i = 1; i; i <<= 1, a <<= 1)if(b & i)ans += a;return ans; }
    Iterator和ListIterator的區(qū)別

    {
      ListIterator有add方法,可以向List中添加對(duì)象,而Iterator不能。
      ListIterator和Iterator都有hasNext和next方法,可以實(shí)現(xiàn)順序向后遍歷,但是ListIterator有hasPrevious和previous方法,可以實(shí)現(xiàn)逆向(順序向前)遍歷。Iterator就不可以。
      ListIterator可以定位當(dāng)前的索引位置,nextIndex和previousIndex可以實(shí)現(xiàn)。Iterator沒(méi)有此功能。
      都可實(shí)現(xiàn)刪除對(duì)象,但是ListIterator可以實(shí)現(xiàn)對(duì)象的修改,set方法可以實(shí)現(xiàn)。Iierator僅能遍歷,不能修改。
    }

    數(shù)據(jù)庫(kù)優(yōu)化

    {
      應(yīng)盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描
      應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
      拆分表: 分區(qū)將數(shù)據(jù)在物理上分隔開(kāi),不同分區(qū)的數(shù)據(jù)可以制定保存在處于不同磁盤上的數(shù)據(jù)文件里
      使用數(shù)據(jù)庫(kù)緩存
      常用查詢,建立索引,使用索引
      盡可能的使用 varchar/nvarchar 代替 char/nchar
      應(yīng)盡量避免在 where 子句中使用 or 來(lái)連接條件
      對(duì)于連續(xù)的數(shù)值,能用 between 就不要用 in 了
    }

    STL

    {
    vector 有insert操作,erase操作,底層容器是數(shù)組
    list 底層容器是雙向鏈表,push_back,push_front ,empty
    deque 底層數(shù)據(jù)結(jié)構(gòu)是一個(gè)中央控制器加緩沖區(qū),用堆來(lái)保存
    stack 底層容器是list或deque
    queue 底層容器是list或deque
    priority_queue 底層容器是vector,以heap來(lái)管理
    set,map,multimap,multiset 底層用紅黑樹
    hash_set,hash_map用哈希表
    }

    測(cè)試用例

    {
    在邊界測(cè)試中,對(duì)于有n個(gè)輸入變量的程序,基本邊界值分析的測(cè)試用例個(gè)數(shù)為4n+1。
    在健壯性測(cè)試中,對(duì)于有n個(gè)輸入變量的程序,健壯性測(cè)試的測(cè)試用例個(gè)數(shù)為6n+1。
       對(duì)于有n個(gè)輸入變量的程序,最壞情況測(cè)試的測(cè)試用例個(gè)數(shù)為5^n。
       對(duì)于有n個(gè)輸入變量的程序,健壯最壞情況測(cè)試的測(cè)試用例個(gè)數(shù)為7^n。
    }

    TCP/IP

    {
      HTTP(超文本傳輸協(xié)議)是一個(gè)基于請(qǐng)求與響應(yīng)模式的、無(wú)狀態(tài)的、應(yīng)用層的協(xié)議。
    HTTP是應(yīng)用層協(xié)議,TCP,UDP是傳輸層協(xié)議。
    文件傳輸協(xié)議FTP、電子郵件傳輸協(xié)議SMTP、域名系統(tǒng)服務(wù)DNS、HTTP協(xié)議等都同是應(yīng)用層協(xié)議。
      HTTP協(xié)議 狀態(tài)代碼有三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類別,且有五種可能取值:
    1xx:指示信息–表示請(qǐng)求已接收,繼續(xù)處理
    2xx:成功–表示請(qǐng)求已被成功接收、理解、接受
    3xx:重定向–要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作
    4xx:客戶端錯(cuò)誤–請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)
    5xx:服務(wù)器端錯(cuò)誤–服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求
    常見(jiàn)狀態(tài)代碼、狀態(tài)描述、說(shuō)明:
    OK //客戶端請(qǐng)求成功
    Bad Request //客戶端請(qǐng)求有語(yǔ)法錯(cuò)誤,不能被服務(wù)器所理解
    Unauthorized //請(qǐng)求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用
    Forbidden //服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)
    Not Found //請(qǐng)求資源不存在,eg:輸入了錯(cuò)誤的URL
    Internal Server Error //服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤
    Server Unavailable //服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求,一段時(shí)間后可能恢復(fù)正常
    }

    總結(jié)

    以上是生活随笔為你收集整理的综合知识点+计算机的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。