1. 程式人生 > >第二章:字串、向量和陣列

第二章:字串、向量和陣列

字串、向量和陣列

名稱空間的using宣告

略過…

標準庫型別string

標準庫型別string表示可變長的字元序列,使用string型別必須首先包含string標頭檔案。
定義和初始化string物件

string s0;      預設初始化,s0是一個空串
string s1(s0);  s1是s0的副本
string s2 = s1; 
string s3("value");
string s5(10,'c');   10個c

如果使用等號(=)初始化一個變數,實際上執行的拷貝初始化(copy initializantion),編譯器把等號右側的初始化值拷貝到最建立的物件中,與之相反,如果不使用等號,則執行的是直接初始化(direct initialization)

string上的操作

常見操作 說明
os<< s 將s寫到輸出流os中,返回os
is>>s 從is中讀取字串賦給s,字串以空白分隔
getline(is,s) 從is中讀取一行賦給s,返回is
s.empty() ture s為空
s.size() 返回s中的字元個數
s1+s1 相加,必須一方是string 物件
s1==s2 判斷的是值

string::size_type型別
string::size_type是size()函式返回的型別,string類及其它大多數標準庫型別都定義了幾種配套的型別,這些配套型別體現了標準庫型別與機器無關的特性

,型別size_type 即是其中一的一種。在具體使用的時候,通過作用域操作符來表明名字string_type是在string中的定義的。

string s("value");

string::size_type i =s.size();

auto  i2 = s.size();

處理string物件中的字元

cctype中檔案中的函式
isalnum(c) 當c是字母或數字時為true
isalpha(c) 當c是字母時為true
iscntrl(c) 當c是控制字元時為true
isdigit(c) 當c是數字時true
isgraph(c) 當c不是空格但可印為true
islower(c) 當c是小寫字母為true
isprint(c) 當c是可列印字元為true
isspace(c) 空白時為true
isupper(c) 是大寫字母為true
isxdigit(c) 是十六進位制數字為true
tolower(c) 如果c是大寫字母,輸出對應的小寫字母,否則原樣輸出c
toupper(c) 如果c是小寫字母,輸出對應的大寫字母,否則原樣輸出c
輸出str中的一個字元
string str("hello world");
for(auto c : str){
  cout<<c<<endl;
}

轉換成大寫形式
for(auto &c: str){
c = toupper(c);
}

下標迭代
for(decltype(str.size()) index =0;index!=str.size()++index){
cout<<str[index] <<endl;
}


//迭代器

標準庫型別vector

標準庫型別vector表示物件的集合,在其中所有物件的型別都相同。因為vector容納其它物件,所以它也常被稱作容器。

定義初始化vector物件

vector<T> v1; 
vector<T> v2(v1);
vector<T> v2 = v1;
vector<T> v3(n,val);
vector<T> v4(n);
vector<T> v5{a,b,c};
vector<T> v6={a,b,c};


//操作
v.push_back(t); 向v的尾端新增一個值為t的元素
...其它和string類似

迭代器介紹

vector<string> v{"a","b"};
end返回尾元素的下一個元素,被稱作尾後迭代器
auto beg = v.begin(),end =v.end();
for(auto it = v.begin();it!=v.end();++it){
cout<< *it<<endl;
}

迭代器型別

it能讀寫
vector<int>::iterator it; 

it2能讀寫
string::iterator it2; 

it3只有讀
vecotr<int>::const_iterator  it3;

it4只有讀
string::const_iterator it4;


const vector<string> v;
返回string::const_iterator
auto beg = v.begin();

c++新標準加入的兩個新函式,返回string::const_iterator
auto beg2 =v.cbegin();
auto beg3 =v.cend();

陣列

陣列是一種類似於標準庫型別vector的資料結構,但是在效能和靈活性的權衡上又與vector有所不同,與vector相似的地方是,陣列也存放型別相同的物件的容器。與vector不同的物件是,陣列的大小確定不變,不能隨意向陣列中增加元素。因為陣列的大小固定,因此對某些特殊的應用來說程式的執行時效能較好,但是相應地也損失了一些靈活性。

定義和初始化內建陣列

含有10個整數的陣列
int arr[10]; 

含有10個整形指標的陣列
int *parr[10]

int  arr2[] ={0,1,2};

int &ref[10] =... 錯誤,不存在引用的陣列

 parray指向一個含有10個整數的陣列
int (*parray)[10]=&arr2; 

 arrRef引用一個含有10個整數的陣列
int (&arrRef)[10] = arr;



字元陣列的特殊性
char a3[]="c++"; 自動新增表示字串結束的空字元

不允許拷貝和賦值。
int a[] ={0,1,2};
int a2[] = a;  錯誤
a2 = a;  錯誤


訪問陣列元素
unsigned scores[11] ={};
for(auto i:  scores){
cout<< i<<endl;
}

指標和陣列

string nums[] ={"one","two","three"};
string *p0 =&nums[0];
string *p1 = nums;  p1與p0等價


int ia[] ={1,2,3,4};
auto ia2(ia); ia2是一個整形指標,指向ia的第一個元素
ia2 =42 錯誤,ia2是一個指標
例外情況:
decltype(ia) ia3 ={1,2,3,4}; ia3是一個含有4個整數的陣列,並不是指標

指標也是迭代器

int arr[] ={1,2,3,4,5};
int *e =&arr[4];
for(int *b = arr;b!=e;++b){
cout<<*b<endl;
}

計算得到尾後指標,極易出錯。標準庫提供了函式begin和end
int ia[] ={1,2,3,4};
int *beg =begin(ia);/指向ia首元素的指標
int *last =end(ia);//指向ia尾後元素指標


vector 和string 迭代器支援的運算,陣列的迭代器也支援