2020年3月6日犬第,正式開(kāi)始學(xué)習(xí)C++诀姚。記錄leetcode上遇到東西儡炼;
1.C++使用變量作為數(shù)組長(zhǎng)度
數(shù)組長(zhǎng)度必須為常量妓湘,其空間分配在棧中——預(yù)編譯時(shí)就要確定。
解決方法:繞過(guò)棧內(nèi)存射赛,將數(shù)組空間開(kāi)辟在堆空間:
int *d=new int[n];//動(dòng)態(tài)數(shù)組
//注意:使用完要 delete[],防止內(nèi)存泄漏
2.整數(shù)上下限
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX-1)
3.<sstream>定義stringstream
類用法
用于流的輸入輸出操作——提供格式轉(zhuǎn)換多柑。
//將整型 x轉(zhuǎn)換成string型 str
stringstream ss;
string ss;
ss<<x;
ss>>str;
不會(huì)主動(dòng)釋放內(nèi)存,需清空:
ss.clear();
或ss.str("");
4.字符串操作
vector<string> ss={"yang","zhao"};
訪問(wèn)某元素方式楣责,ss[i][j]
或ss[i].at(j)
竣灌。
讀取字符串長(zhǎng)度:
sizeof():運(yùn)算符,值在編譯時(shí)確定,不能用于返回動(dòng)態(tài)分配空間大小秆麸。
strlen():函數(shù)初嘹,其參數(shù)必須為char *
,返回字符串長(zhǎng)度(不包括/0)
string類中l(wèi)ength()/size():返回字節(jié)數(shù)
子串:
.substr(i,n);
:字符串第i個(gè)位置開(kāi)始長(zhǎng)度為n的子串
查找:
s.find(s2,pos);
:從下標(biāo)pos開(kāi)始查找string對(duì)象s2,返回找到第一次匹配的下標(biāo)值。
s.find_first_of(args);
:在s中查找args的任意字符第一次出現(xiàn)的位置沮趣。
5.constexpr
關(guān)鍵字(C++11)
- 生成常量表達(dá)式:編譯時(shí)便計(jì)算出調(diào)用地方的結(jié)果屯烦。
constexpr int multiply (int x, int y){
return x * y;
}
// 將在編譯時(shí)計(jì)算
const int val = multiply( 10, 10 );
- 允許函數(shù)被應(yīng)用在以前調(diào)用宏的所有場(chǎng)合,如可用
constexpr
函數(shù)聲明數(shù)組大小。
constexpr int getDefaultArraySize (int multiplier){
return 10 * multiplier;
}
int my_array[ getDefaultArraySize(3)];//編譯時(shí),聲明數(shù)組 my_array[30]
constexpr函數(shù)的限制:
- 函數(shù)中只能有一個(gè)return語(yǔ)句(有極少特例)
- 只能調(diào)用其它c(diǎn)onstexpr函數(shù)
- 只能使用全局constexpr變量
注意遞歸并不受限制。但只允許一個(gè)返回語(yǔ)句驻龟,那如何實(shí)現(xiàn)遞歸呢温眉?可以使用三元運(yùn)算符(?:)。例如翁狐,計(jì)算n的階乘:
constexpr int factorial (int n){
return n > 0 ? n * factorial( n - 1 ) : 1;
}
constexpr函數(shù)的特點(diǎn):
- 只允許包含一行可執(zhí)行代碼类溢。但允許包含typedefs、 using declaration && directives露懒、靜態(tài)斷言等闯冷。
- 同樣可在運(yùn)行時(shí)被調(diào)用,當(dāng)這個(gè)函數(shù)的參數(shù)是非常量的懈词。
- 編譯時(shí)使用類對(duì)象蛇耀,具體參考C++11系列-常量表達(dá)式
6.std
std
里面定義了C++的各種標(biāo)識(shí)符,使用容器要#include<容器頭文件>
和using namespace std;
坎弯。
7.
accumulate(a,a+n,initialValue,operator)其中a指向首元素纺涤,a+n指向尾元素后一個(gè)元素,將首尾中間的元素按照operator(指定的算法比如相加)之后再加上initialValue之后再返回抠忘。
- copy(start ,end, to)將元素從位置start,start+1...end-1依次復(fù)制到位置to,to+1,...to+end-start洒琢。必將常用的是copy(list,list+m+1,ostream_iterator<T>(cout,""))其中ostream_iterator<T>(cout,"")是個(gè)流迭代器它指向cout流,這就話的意思就是將list和list+m+1之間的內(nèi)容復(fù)制到輸出流褐桌,也就是用cout輸出這其中的內(nèi)容衰抑。
8.new初始化
int *pia = new int[10]; // 10個(gè)未初始化int
int *pia2 = new int[10](); // 10個(gè)值初始化為0的int
9.指針指向類型
- char每次移動(dòng)1個(gè)字節(jié);short移動(dòng)2個(gè)字節(jié) 荧嵌;int , long ,float移動(dòng)4個(gè)字節(jié) 呛踊;double移動(dòng)8個(gè)字節(jié)
- 無(wú)論是整型數(shù)組還是字符數(shù)組,數(shù)組名作為右值的時(shí)候都代表數(shù)組首元素的首地址啦撮。
數(shù)組發(fā)生降級(jí)(數(shù)組名退化為數(shù)組首元素的地址)的情況:數(shù)組傳參谭网、數(shù)組名參與運(yùn)算
數(shù)組名不會(huì)發(fā)生降級(jí)的情況:sizeof(數(shù)組名)、取地址數(shù)組名(取到的是整個(gè)數(shù)組的地址而不是首元素的地址)
比較分析與數(shù)組相關(guān)的sizeof和strlen
32位指針是4字節(jié)
sizeof():
https://blog.csdn.net/skyroben/article/details/53207795
計(jì)算數(shù)組大小:
- 當(dāng)括號(hào)傳數(shù)組名赃春,指的是整個(gè)數(shù)組所有元素占多少個(gè)字節(jié)愉择;當(dāng)傳數(shù)組元素,指的是數(shù)組元素占多少個(gè)字節(jié)织中;一般有取地址符&使用sizeof計(jì)算所占內(nèi)存的大小即為計(jì)算地址的大小為四個(gè)字節(jié)(32位機(jī)器)锥涕。
計(jì)算類大腥薄:
(1)首先看一下類有沒(méi)有父類悼瘾,如果沒(méi)有父類:
a:且沒(méi)有虛函數(shù)的話缴渊,直接計(jì)算類的成員變量的大幸乇酢(注:類的靜態(tài)成員變量不計(jì)入類的大小)泻肯;
b:有虛函數(shù)的話叠纹,類的大小=類的成員變量的大小+一個(gè)虛表地址的大小 玉控;
(2) 有父類:
a:父類沒(méi)有虛函數(shù),子類也沒(méi)有虛函數(shù) 座每,直接計(jì)算兩個(gè)類的成員變量的大小相加前鹅;
b:子類有虛函數(shù)或者父類有虛函數(shù)或者兩個(gè)都有虛函數(shù),類的大小=兩個(gè)類的成員變量的大小之和+一個(gè)虛表地址的大星褪帷嫡纠;
(3)菱形繼承(沒(méi)有虛繼承):
8.
int*p1 = reinterpret_cast<int*>(p); //將p強(qiáng)制轉(zhuǎn)換位int* 賦值給p1
- 堆上的對(duì)象指針:手動(dòng)釋放,
new
;- 棧上的對(duì)象,main函數(shù)結(jié)束釋放延赌;
- 靜態(tài)儲(chǔ)存區(qū),在程序結(jié)束時(shí)釋放叉橱,
static
;
虛函數(shù)——?jiǎng)討B(tài)綁定:
- 虛函數(shù):基類函數(shù)聲明為
virtual
時(shí)挫以,指向派生,除非派生沒(méi)有可調(diào)用的實(shí)現(xiàn)窃祝,才調(diào)用基類虛函數(shù)掐松。- 不為虛函數(shù):基類指針必然調(diào)用基類方法,派生類指針必然調(diào)用派生類方法
構(gòu)造函數(shù)
9粪小、深拷貝大磺、淺拷貝(拷貝構(gòu)造)
- 深拷貝:被拷貝對(duì)象在動(dòng)態(tài)分配的存儲(chǔ)空間,先動(dòng)態(tài)申請(qǐng)一塊存儲(chǔ)空間探膊,逐字節(jié)拷貝內(nèi)容杠愧;
- 淺拷貝:僅拷貝指針字面值——當(dāng)釋放原對(duì)象,產(chǎn)生空懸指針逞壁。
10流济、在c/c++函數(shù)中,不應(yīng)該返回局部變量數(shù)組
- 在函數(shù)中腌闯,局部變量是存儲(chǔ)在棧內(nèi)存中的绳瘟,而函數(shù)的返回是值拷貝。
- 因此數(shù)組返回實(shí)際是返回指向棧內(nèi)存中這個(gè)原數(shù)組的首地址姿骏,但是函數(shù)結(jié)束后該內(nèi)存是會(huì)被自動(dòng)回收糖声,因此該指向的棧內(nèi)存是無(wú)效的。