第二章:字串、向量和陣列
阿新 • • 發佈:2019-01-30
字串、向量和陣列
名稱空間的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類及其它大多數標準庫型別都定義了幾種配套的型別,這些配套型別體現了標準庫型別與機器無關的特性
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 迭代器支援的運算,陣列的迭代器也支援