標頭檔案不應該包含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...