using聲明
- 具體形式:using namespace::name ;
- 注意事項:
- 每個名字需要有獨立的using聲明;
- 頭文件不應(yīng)該包含using聲明;
using std::cin;
using std::cout;
using std::endl;
標準庫類型String
- 頭文件:#include<string>
- 定義和初始化string對象:
- 初始化方式:
string s1; //默認初始化,s1是一個空串
string s2 = s1; //s2是s1的副本
string s2(s1); //與上式等價,s2是s1的副本
string s3("value"); //s3是字面值"value"除最后空字符外的副本
string s3 = "value"; //與上式等價
string s4(n, 'c'); //s4初始化為由連續(xù)n個字符c組成的字符串
- 使用等號:拷貝初始化;
不使用等號:直接初始化;
- string對象的操作:
cout<<s; //將s寫到輸出流os中,返回cout
cin>>s; //從is中讀取字符串賦給s,字符串以空白分隔,返回cin
getline(is, s); //從is中讀取一行賦給s,返回is
s.empty(); //檢測s是否為空串,返回bool值
s.size(); //返回s中字符的個數(shù)
s[n]; //返回s中第n個字符的引用,n位置從0計起
s1+s2; //返回s1和s2連接后的結(jié)果
s1 = s2; //用s2的副本代替s1中的原有字符
==, !=, <, <=, >, >=; //利用字典序?qū)ψ址M行比較,對大小寫敏感
- string對象的讀寫
- 執(zhí)行讀取操作時,string對象會自動忽略開頭的空白,并從第一個真正的字符開始讀起,直到遇見下一處空白為止
- 使用getline讀取一整行:getline函數(shù)從給定的輸入流讀入內(nèi)容,直到遇到換行符為止,將所讀的內(nèi)容存入字符串中(讀入換行符,但不存儲換行符)
- 使用輸入輸出流及getline函數(shù)對字符串讀寫操作時,均返回對應(yīng)輸入輸出流
- string對象的empty和size操作
- empty()返回布爾值
- size()返回string::size_type類型,為無符號整型數(shù)
- string對象比較:大小寫敏感
- 字面值與string類型相加:
- 相當于類型轉(zhuǎn)換,字面值轉(zhuǎn)換為string類型;
- 運算符兩邊至少有一個操作數(shù)為string類型,否則產(chǎn)生錯誤;
- 處理string對象中的字符
- 字符處理函數(shù):cctype頭文件;
isalnum(c); //字母或數(shù)字為真
isalpha(c); //字母為真
iscntrl(c); //控制字符為真
isdigit(c); //數(shù)字為真
isgraph(c); //不是空格但可打印為真
islower(c); //小寫字母為真
isprint(c); //可打印字符為真(空格/可視形式)
ispunct(c); //標點符號為真
isspace(c); //空白為真
isupper(c); //大寫字母為真
isxdigit(c); //十六進制數(shù)字為真
tolower(c); //輸出對應(yīng)小寫字母
toupper(c); //輸出對應(yīng)大寫字母
- range for語句:訪問字符串中的每一個字符
for(declaration: expression)
statement
//expression:表示一個序列,string可作為expression
//declaration:定義一個變量,用來訪問序列中的基礎(chǔ)元素
- 下標運算符:隨機訪問,范圍為0 ~ size()-1,類型最好為string::size_type
標準庫類型vector
- 頭文件:#include<vector>
- 定義和初始化vector對象:
vector<T> v1; //v1為空,潛在類型為T,執(zhí)行默認初始化
vector<T> v2(v1);//v2中包含v1中所有元素的副本
vector<T> v2 = v1; //等價于上式
vector<T> v3(n, val); //v3中包含了n個重復(fù)的元素,每個元素的值為val
vector<T> v4(n); //v4包含了n個重復(fù)執(zhí)行值初始化的對象
vector<T> v5{a, b, c...}; //v5包含了初始值個數(shù)的元素,每個元素被賦予相應(yīng)初始值
vector<T> v5 = {a, b, c...}; //等價于上式
- 在初始化中如果略去初值,則內(nèi)置類型自動設(shè)為0,類類型由類默認初始化
- 編譯器會首先將花括號{ }中的內(nèi)容作為列表初始化初值,如果無法執(zhí)行列表初始化,編譯器會考慮其它初始化方式
- 圓括號則明確表示為構(gòu)造而非列表初始化
- vector相關(guān)操作:
v.empty(); //如果v中不含有任何元素,則返回真
v.size(); //返回v中的元素個數(shù)
v.push_back(t); //向v的尾端添加一個值為t的元素
v[n]; //返回v中第n個元素的引用,n位置從0計起
v1 = v2; //用v2中的元素拷貝替換v1中的元素
v1 = {a, b, c...}; //用列表中的元素拷貝替換v1中的元素
==, !=, <, <=, >, >=;
- 想要為vector添加對象前,先把vector定義為一個空對象
- 如果循環(huán)體內(nèi)包含向vector添加對象的操作,不可使用range for語句
- 不可使用下標形式為數(shù)組添加元素(下標僅可對已存在的索引值進行訪問)
迭代器iterator
- 迭代器:訪問容器類型元素的更通用機制
- 使用迭代器:
- 迭代器類型:iterator, const_iterator
- 獲取迭代器的成員函數(shù):
begin(), end(), 所獲取的類型有容器類型決定;
cbegin(), cend(), 返回類型均為const_iterator;
begin(), cbegin()返回容器的首個元素;
end(), cend()返回容器尾部元素的下一個元素,稱為尾后迭代器;
容器為空時,begin()與end(), cbegin()與cend()返回值相同。 - 迭代器的運算符:
*iter; //返回迭代器iter所指元素的引用
iter->mem; //解引用iter并獲取該元素的名為mem的成員,等價于(*iter).mem
++iter; //令iter指示容器中的下一個元素
--iter; //令iter指示容器中的上一個元素
==, !=;
- 任何一種可能改變vector對象容量的操作會使該vector對象的迭代器失效
- 迭代器運算
iter + n; //相對于iter原位置向后移動n個元素
iter - n; //相對于iter原位置向前移動n個元素
iter += n; //復(fù)合賦值運算符
iter -= n;
iter1 - iter2; //返回兩個迭代器間的距離,類型是名為difference_type的帶符號整數(shù)
>, >=, <, <=;
//以上涉及兩個迭代器的運算均要求迭代器指向同一容器中的元素或者尾元素的下一個位置。
C++新標準與舊代碼的接口
- string與C風格字符串
- 允許使用空字符結(jié)束的字符數(shù)組初始化string對象或為其賦值
- 在string對象的加法運算中允許使用以空字符結(jié)束的字符數(shù)組作為其中一個運算對象,在string對象的復(fù)合賦值運算中允許使用以空字符結(jié)束的字符數(shù)組作為右側(cè)的運算對象
- string類提供成員函數(shù)c_str(),返回值為指向string類型對應(yīng)的C風格字符串的指針,指針類型為const char*
string s("Hello World!");
const char *str = s.c_str();
2.使用數(shù)組初始化vector對象:需要指明拷貝區(qū)域的首元素地址和尾后地址
int int_arr[6] = {0, 1, 2, 3, 4, 5};
vector<int> ivec(begin(int_arr), end(int_arr)); //包含int_arr數(shù)組的所有元素
vector<int> subVec(int_arr + 1, int_arr + 4); //包含第1、2、3個元素。