c 11 2 字串 向量和陣列

2021-06-25 07:29:18 字數 4107 閱讀 2460

標頭檔案不應該包含using宣告,防止名字衝突

string 定義在命名空間std中。

初始化string物件方式:

string s1;

string s2(s1);

string s2=s1;

string s3("value");

string s3="value";

string s4(n,'c')   ///s4初始化成由n個字元c組成的串

用等號執行的是拷貝初始化,不用等號是直接初始化

string s8=string(10,'c');//通過建立臨時物件來實現拷貝初始化

string的操作:

os>s;

getline(is,s);//從is中讀取一行賦給s,返回is,直到遇到換行符為止,注意不存換行符

s.empty();

s.size();  //返回值為string::size_type,可通過auto和decltype來推斷,該型別是無符號型

s[n];

s1+s2;

s1=s2;

s1==s2;

s1!=s2;

<,<=,>,>=;   

string s2=s1+",";  //對

string s3="hello"+",";  //錯

cctype標頭檔案中的函式:

isalnum(c)        當c是字母或數字時為真

isalpha(c)        當c是字母是為真

iscntrl(c)        當c是控制字元時為真

isdigit(c)        當c是數字時為真

isgraph(c)        當c不是空格但可列印是為真

islower(c)       當c是小寫字母時為真

isprint(c)        當c是可列印字元時為真,即c是空格或c具有可視形式

ispunct(c)        當c是標點符號是為真

isspace(c)        當c是空白時為真

isupper(c)        當c是大寫字母時為真

isxdigit(c)        當c是十六進製制數字時為真

tolower(c)        如果c是大寫字母,輸出對應的小寫字母,否則原樣輸出c

toupper(c)        如果c是小寫字母,輸出對應的大寫字母,否則原樣輸出c

string str("some string");

for(auto c:str)

cout<< c《如果想要改變string的值那就要宣告為引用

for(auto &c:s)

c= toupper(c);

因為引用不是物件,所以不存在包含引用的vector;

老版c++vector>要有空格,c++11不是必須

vector初始化方法:

vectorv1;

vectorv2(v1);

vectorv2=v1;

vectorv3(n,val)     //n個重複的val值

vectorv4(n);   //n個重複執行了值初始化

vectorv5

vectorv5=;  ///只能放在花括號中

注意圓括號和花括號的區別。

vectorv5; //列表初始化

vectorv6("hi"); //錯,不能使用字串字面值來構建vector物件

vectorv7;    //v7   有10 個預設初始化元素

vectorv8;    //v8 有10個「hi」值

使用花括號是如果不能進行列表初始化,就考慮其他方式

想vector中新增元素,push_back;

如果所有元素都一樣就在初始化時指定vector大小,否則採用自動增長。

如果迴圈體內部包含想vector物件新增元素,則不能使用for each迴圈

for each 語句內部能改變範圍的大小

vector的其他操作:

v.empty()

v.size()

v.push_back(t)

v[n]

v1=v2

v1=  ///用v2中的元素的拷貝替換v1中的元素

v1==v2

v1!=v2

<,<=,>=>=

要使用size_type,必須明確:vector::size_type,  size()返回值

進行比較是元素必須是可比較的,(有的類沒有定義比較,不可用做vector元素);

不能用下標來新增元素,超出size(),只能對已存在的元素使用下標操作

所謂緩衝區溢位指的就是通過下標訪問了不存在的元素,可以盡可能的使用for each

string不是容器,但支援很多容器的操作

end()返回的是最後乙個元素的下乙個位置

如訪問begin()時注意檢查begin!=end

end不能用解引用,和自增操作

所有的標準容器都定義了==和!=,大多數都麼有定義<

vector::const_iterator   常量迭代器

cbegain   cend   不管物件是不是常量,都返回的是常量迭代器

(*it).empty()   等價於    it->empty()    

*it.empty()   ///錯

vector的限制,

不能在範圍for迴圈中想vector物件新增元素

任何一種可能改變vector物件容器的操作,比如push_back,都會使該vector物件的迭代器失效。

切記,,使用了迭代器的迴圈體,都不要向迭代器所屬容器新增元素。

兩迭代器相減得到的是,difference_type的帶符號整型數,可正可負;

二分搜尋

auto beg=text.begin(),end=text.end();

auto mid=text.begin()+(end=beg)/2;

while(mid!=end&& *mid != sought)

int *ptrs[10];    ///含有10個整型的陣列

int &ptr[10];   //錯

int  (*parray)[10] = &arr;   ///parray指向乙個含有10個元素的整數的陣列

int   (&arrref)[10] = arr;    //arrref引用以個含有10個元素的陣列

型別修飾符從右向左依次繫結

陣列的下標通常定義成 size_t 型別,與機器相關的無符號型別,在cstddef標頭檔案中定義

int ia=;

auto ia2(ia);  ///返回的是指向ia第乙個元素的指標

decltype (ia) ia3=;//decltype(ia)    返回的型別是由3個int構成的陣列;

begin(ia)  ,   end(ia)   //c++11新

auto n=end(arr)-begin(arr),得到的是ptrdiff_t的標準庫型別,在cstddef中

標準庫型別限定使用的下標是無符號型,而內建的下標運算無此要求

在c++中最好不好使用c風格的字串,有風險

cstring標頭檔案,

strlen(p);

strcmp(p1,p2);// p1>p2返回的是正值

strcat(p1,p2);//不能缺包 p1足夠放下p1+p2,風險

strcpy(p1,p2);

上述函式不會驗證引數,傳入的字元陣列必須以'/0'結束

const char *str=s.c_str();

int int_arr[ ]=;

vectorivec(begin(int_arr),end(int_arr));//用陣列初始化vector,也可以使陣列的一部分,

盡量使用標準庫型別而非陣列

int  (&row)[4];       含有4個整數的陣列的引用

for(const auto &row : ia)

for(auto col : row)

cout《這個迴圈中麼有寫操作,但仍然將外層迴圈的控制變數宣告成了引用,是為了避免陣列被自動轉換成指標

要使用for each 語句,對於多維陣列,除了最內層迴圈,其他所有的迴圈的控制變數都要是引用型別。

可使用auto  和typedef 來簡化  多維陣列的訪問

三 字串 向量和陣列

一 標準庫型別string 1 使用等號 初始化乙個變數,執行的是拷貝初始化,編譯器把等號右側的初始值拷貝到新建立的物件中 如何不使用等號,則執行的是直接初始化。2 os is s 從is中讀取字串賦給s,字串以空白分隔,返回is getline is,s 從is中讀取一行賦給s,返回is 3 st...

C 字串 向量和陣列

vector物件 以及string物件 的下標運算子可用於訪問已存在的元素,而不能用於新增元素。只能對確知已存在的元素執行下標操作。所有標準庫容器都可以使用迭代器,string物件不屬於容器型別,但是支援很多與容器型別類似的操作。const vectorcv auto it cv.begin it ...

Chapter3 字串 向量和陣列

vector 初始化有多種方法,下面將這些方法詳細羅列 vector v1 定義了乙個空vector,潛在元素是t型別,執行預設初始化 vector v2 v1 v2是v1的拷貝 vector v2 v1 同上 vector v3 n,val v3包含n個重複的元素,每個的值都是val vector...