C 學習之路(二)

2021-09-19 15:18:57 字數 4714 閱讀 8677

如果處於某種原因,要將一條語句放到兩行中,可以在第一行末尾新增反斜槓 \,否則會出錯。

左值通常是記憶體單元,右值可以使記憶體單元的內容。

因此所有的左值都可用作右值,但並非所有的右值都可用作左值。

例如365 = year;不合理

邏輯運算符合按位運算的差別在於,按位運算子返回的並不是布林值,而是對運算元對應位執行指定運算的結果。

移位運算子(<<、>>)將整個位序列向左或向右移動,其用途之一是將資料乘以或除以2n。

三目操作符:

?:例如:

int max = (num1 > num2) ? num1 : num2;

等同於:

int max;

if (num1 > num2)

else

基於範圍的for迴圈

for (vartype varnmae : sequence)

{}

例如給定乙個陣列:

int somenums = ;

for (int a : somenums)

cout << a << endl;

就可以把陣列的每個元素輸出。

順序容器按照順序儲存資料,如陣列和列表。順序容器具有插入速度快但查詢操作相對較慢的特徵。

關聯容器按指定的順序儲存資料,就像字典一樣。這將降低插入資料的速度,但在查詢方面有很大的優勢。

容器介面卡是順序容器和關聯容器的變種,其功能有限,用於滿足特定的需求。

迭代器是一種檢查容器內元素並遍歷元素的資料型別。可以替代下標訪問vector物件的元素。每種容器型別都定義了自己的迭代器型別,如 vector:

vector::iterator iter;

上述語句定義了乙個名為 iter 的變數,它的資料型別是 vector< int > 定義的 iterator 型別。每個標準庫容器型別都定義了乙個名為 iterator 的成員,這裡的 iterator 與迭代器實際型別的含義相同。

(1)stl string 類

拼接字串

sting samplestr1 ("hello");

string samplestr2 ("string");

samplestr1 += samplestr2;

或都可以把"hello"和"string" 鏈結起來。

查詢

size_t charpos = samplestr.find ("day", 0);

if (charpos != string :: npos)

cout ....

else

cout ....

size_t在32位架構上是4位元組,在64位架構上是8位元組,在不同架構上進行編譯時需要注意這個問題。而int在不同架構下都是4位元組,與size_t不同;且int為帶符號數,size_t為無符號數。

ssize_t是有符號整型,在32位機器上等同與int,在64位機器上等同與long int.

size_t一般用來表示一種計數,比如有多少東西被拷貝等。例如:sizeof操作符的結果型別是size_t,該型別保證能容納實現所建立的最大物件的位元組大小。 它的意義大致是「適於計量記憶體中可容納的資料專案個數的無符號整數型別」。所以,它在陣列下標和記憶體管理函式之類的地方廣泛使用。

而ssize_t這個資料型別用來表示可以被執行讀寫操作的資料塊的大小.它和size_t類似,但必需是signed.意即:它表示的是signed size_t型別的。

截斷

erase()

string samplestr ("hello string! wake up to a beautiful day !);

samplestr.erase (13, 28); // 刪除從第13個到第28個字元。

samplestr.erase(ichars); //刪除指定的字元 ichars = ...

samplestr.erase (samplestr.begin (), samplestr.end());

反轉

string samplestr ("hello string! we will recerse you!);

reverse (samplestr.begin (), samplestr.end());

(2) stl 動態陣列

vector

要例項化vector,需要指定要在該動態陣列中儲存的物件型別:

std ::vectordynintarray;

std::vectordynfloatarray;

std::vectordyntunaarray;

使用push_back()在末尾插入元素

vectorintegers;

integers.push_back(8);

列表初始化:

vectorintegers = ;

或者vectorintegers

使用insert()在指定位置插入元素

integers.insert(integers.end(),2,5); //在末尾插入兩個5
刪除vector中的元素

使用pop_back()刪除末尾的元素。

理解大小和容量

vector的大小指的是實際儲存的元素數,而vector的容量指的是在重新分配記憶體以儲存更多元素前vector能夠儲存的元素數。因此,vector的大小 <= 容量。

我的理解: vector就像乙個可以變化大小的水桶,一開始裝10l的水,大小和容量都是10,現在把水倒了 裝5l 那麼大小就是5 容量還是10 ,再倒了 裝20l的水,那麼大小和容量都是20l。

查詢大小

cout << "size: " << integers.size () << endl;

查詢容量:

cout << "capacity" << integers.capacity() << endl;

deque

與vector非常相似,但支援在陣列開頭和末尾插入或刪除元素。用push_front()和pop_front()

list是雙向鍊錶,優點主要是,插入和刪除元素的速度快,且時間是固定的。

forward_list 是單向鍊錶,只能沿著乙個方向遍歷。

例項化list

std::listlinkints;

std::listlistfloats;

std:listlisttuna;

要宣告乙個指向list中元素的迭代器,可以這樣做:

std::list::const_iterator elementinlist;

和deque類似,要在list開頭或者末尾插入元素,可使用,push_front(),push_back()

forward_list

插入元素只能用push_front(),而不能使用push_back()

容器set和multiset讓程式設計師能夠在容器中快速查詢鍵,鍵是儲存在一維容器中的值。set和multiset之間的區別在於,後者可以儲存重複的值,而前者只能儲存唯一的值。

為了實現快速搜尋,stl set和multiset的內部結構像二叉樹,這意味著將元素插入到set或multiset時將對其進行排序,以提高查詢速度。

例項化std::set物件

類似於之前的

查詢

auto elementfound = setints.find(-1);

if (elementfound != setints.end())

map和multimap之間的區別在於,後者能夠有儲存重複的鍵,前者只能儲存唯一的鍵

例項化map

#include using namespace std;

...map > mapobj;

multimap > mapobj;

第三個引數是可選的,如果指定了鍵和值的型別,而省略了第三個模板的引數,將預設公升序。

例如:std :: map mapinttostr;

std :: multimap mmapinttostr;

lambda表示式是一種定義匿名函式物件的簡潔方式,是c++11新增的。

定義lambda表示式

lambda表示式定義必須以方括號打頭[ ]。這些括號告訴編譯器,接下來是乙個lambda表示式。方括號後面是乙個引數列表,該引數列表與不使用lambda表示式時提供給operator()的引數列表相同。

(type paraname)

C 學習之路

由淺入深 錢能的c 程式設計或thinking in c 中文版就不要看了 c primer effective c more effective c exceptional c more exceptional c 看完這幾本書開始coding 最好跟乙個比較大的專案 同時自己用c 來重做資料結構...

C 學習之路

經過近半個月的時間,完成了 完善 答辯,近來無事,是時候鞏固一下c 了 就只記得三個特徵 封裝 繼承 多型,僅此而已,像模板 stl已經忘光了,設計模式更不用說了,總之,又是乙個新的起點,打算在乙個星期之內複習完c 有志同道合之人可與我一起進步,希望各位大佬給予我更多的指導!第乙個程式 hello ...

c 學習之路

c 知識點總結 primer c 習題答案 c 資源網 高併發網路庫 c 知識點 學習筆記 一 作用域符 1 全域性作用域符 name 用於型別名稱 類 類成員 成員變數 成員函式 變數等 前,表示作用域為全域性命名空間 2 類作用域符 class name 用於表示指定型別的作用域範圍是具體某個類...