c++primer 第三章數組 string vector

命名空間的using聲明

使用using格式:
  using namespace::name;
  example:
   using std::cin;
頭文件不應包含using聲明

3.2 string
3.2.1 定義和初始化
方式:
string s1;//默認初始化,其爲一個空串
string s2=s1;
string s3(s1);//yus2 相同
string s4=“anbadfa”;
string s5(n,’c’);
對於多個值初始化最好使用直接初始化而不是拷貝初始化
3.22string對象上面的操作
s.empty();
s.size();
s[n];
s1+s2;
getline(is,s);
s1=s2;
s1==s2;
<,>,<=,>=
讀取未知數量的string對象:
string s;
while(cin>>s)
cout<< s;
使用getline讀取一行
getline(cin,s);
string::size_type類型
它是一個無符號類型,用了size()就不要再用int了
比較string對像:字典順序
1.如果兩對象長度不同,較短對象每個字符與較長對象對應位置字符都相同,較短對象小於長的、
2.如果字符不同,比較結果是第一對對應位置相異的字符的比較結果
string對象的賦值 、相加;相加應確保至少有一個是string

由於歷史原因,字符串字面值並不是string類型
處理string對象中的字符
#include 中定義的函數:
isalnum(c);
isalpha(c);
iscntrl(c);
isdigit(c);
isgraph(c);
isprint(c);
islower(c);
isupper(c);
isspace();
ispunct(c);
isxdigit(c);
tolower(c);
toupper(c
將c語言中的name.h改爲C++的cname;並且在名稱空間std中

3.3vector 她是一個類模板
編譯器根據模板創建類或者函數的過程稱爲實例化
初始化:
1. vector v1;
2. vector v2(v1);
2. vector v2=v1;
3. vector v3(n,val);
4. vector v4(n);
5. vector v5{a,b,c,..};
5. vector v5={a,b,c,..};
必須使用直接初始化制定向量大小
vectorvi(10);//10個元素每個都是0;
vectorv2{10};//1個元素10;
vectorv3(10,1)//10個1;
vectorv4{10,1};//10he 1
圓括號是來構建對象的,花括號是來初始化值的;
操作
v.push_back(t);
v.size();
v.empty();
v[n];
v1=v2;
v1!=v2;
v1={a,b,c,…}
<,<=,>,>=比較與string相同
試圖用下表訪問一個不存在的元素將不會被編譯器發現,而是運行時產生一個不可知值,也即緩衝區溢出;
解引用和成員訪問結合的操作:->;
*凡是使用了循環體的迭代器都不要向該迭代器所屬的容器添加元素
*兩個迭代器的差值是一個difference_type的帶符號整形數

數組

不清楚元素個數請使用vector
聲明爲constexpr的變量一定是常量表達式
初始化數組
int arr[10];//含有10個元素的數組
int *parr[10];//含有10個整形指針的數組
和內置類型一樣,如果在函數內部定義了某種內置類型的數組,那麼默認初始化會令數組含有未確定意義的值
*定義數組必須指定數組類型,不允許使用auto關鍵字由初始值的列表來推斷類型
*顯式初始化數組
* 字符數組的特殊性
可以使用字符串字面值來初始化字符數組:但是字符串字符數量+1不能大於數組容量
數組不允許拷貝和賦值
理解複雜的數組聲明
int * ptr[10];//含有10個整形指針的數組
不存在引用的數組
int (*parray)[10]=&arr ;//parry指向一個含有10個int的數組
int &ref[10]=…;/./錯誤
int (&arrRef)[10]=arr;//引用一個含有10個int的數組
默認情況下類型修飾符是從右向左依次綁定,從右向左表較好理解她的含義;但是對於數組應該從數組名開始從內向外理解聲明的含義
* 數組除了固定大小以外其他用法與vector基本類似
* 使用數組下標的時候同常把它定義爲size_t類型。這是一種機器相關的無符號類型,定義在cstddef
* 檢查下標的值
**大多數安全問題源於緩衝區溢出,當數組或其他類似數據結構的下標越界並試圖訪問非法內存區域時,就會產生此類錯誤
指針和數組關係密切,使用數組時編譯器一般把它先轉換成指針
在一些情況下數組的操作實際是指針的操作,當用數組作爲auto變量的初始值時,推斷得到的是類型是指針而非數組,
int a[]={1,2,4,4,5};
auto ia(a);//ia是一個整形指針,指向a的第一個元素;
使用decltype時上述轉換不會發生
decltype (a) ia={1,4,6,7};
ia=p;//錯誤,不能把一個指針你給數組賦值
ia[1]=10;//zhengque
**使用數組名或者第一個元素的地址可以得到首指針,尾後指針可以這樣得到:
int * e=&a[10];//假設數組a有10個元素
標準庫函數begin 和end,定義在iterator頭文件
int ia[]={0,1,2,3,4,5,6,7,8,9};
int * beg=begin(ia);
int *last=end(ia);
數組指針相減是一個ptrdiff_t的無符號類型的
數組的內置下表運算可以處理下標爲負的情形,負值就是向前移動
c風格字符串:定義在cstring頭文件
字符串字面值是一種通用的結構實例,這種結構是c++從c繼承而來的c風格字符串,以空字符結束\0
一般使用指針來操作這些字符串
strlen(p);
strcpy(p1,p2)
strcmp(p1,p2);、、相等返回0,p1>p2返回正值,否則返回負值
strcat(p1,p2);
當使用數組的時候實際使用的指向數組首元素的指針
與舊代碼的接口
1. 允許使用字符串字面值初始化string對象
2. 任何出現字符串字面值的地方都可以使用以空字符結束的字符數組來代替
3. 允許使用以空字符結束的字符數組來初始化string對象或爲string對象賦值
4. 在string對象的加法運算中允許使用以空字符結束的字符數組作爲一個運算對象(不能兩個對象都是,並且應該在右邊)
5. 上述性質反過來不成立,即如果要處理c風格字符串,則不能用string來代替
如:不能用string對象直接初始化指向字符的指針,爲完成該功能可以使用c_str()成員函數
char * str=s;//錯誤,不能用string初始化char*
const char * str=s.c_str(); //正確
儘量使用string、vector和迭代器,避免使用數組、指針、c風格字符串

多維數組

嚴格來說,c++沒有多維數組,通常所說的多維數組是數組的數組
第一個維度代表數組本身大小,第二個維度代表元素大小
初始化:
int ia[3] [4] ={
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
等價於:
int ia [3][4] ={0,1,2,3,4,5,6,7,8,9,10,11};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章