這一章節感覺挺重要的,刷leetcode的時候也經常會用到vector和string。感覺python處理起列表和字符串都更加方便,C++引入了string和vector容器,也方便了很多。
3.1 命名空間的using聲明
我們用到的庫函數基本上都屬於命名空間std。
std::cin表示從標準輸入中讀取內容,使用命名空間std中的名字cin。::爲域作用符,含義是編譯器應從左側名字所示的作用域中尋找右側那個名字。
然而這種表達方式比較繁瑣,所以使用using聲明來簡化。
using namespace::name;
注意:頭文件不應包含using聲明
因爲頭文件的內容會被拷貝到所有引用它的的文件中去,如果頭文件裏有某個using聲明,那麼每個使用了該頭文件的文件都會有這個聲明。可能會造成名字衝突。
3.2 標準庫類型string
(1)定義和初始化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初始化爲由n個字符c組成的串
兩種初始化方式:
直接初始化
拷貝初始化:使用等號,把編譯器等號右邊的初始值拷貝到新建的對象中去。
(2)string對象上的操作
- 讀寫string對象
- 使用getline讀取一整行
getline(cin,line)
- string::size_type類型
size_type體現了標準庫類型與機器無關的特性。通過作用域操作符來表明名字size_type是在類string中定義的
size函數返回的是一個無符號整型數,切勿和帶符號數混合使用。
- 比較string對象
- 爲string對象賦值
- 兩個string對象相加
- 字面值和string對象相加
當string對象和字符字面值及字符串字面值混在一條語句中使用時,必須確保每個假髮運算符(+)的兩側的運算對象至少有一個是string。
s1="hello",s2="world!";
string s6=s1+","+"world";//正確
string s7="hello"+","+s2;//錯誤:不能把字面值直接相加
練習3.2
一次讀入一整行,使用getline(cin,line)函數
#include <iostream>
#include <string>
using namespace std;
void main()
{
string mystring;
while (getline(cin , mystring))
{
cout<<mystring<<endl;
}
}
一次讀入一個詞
#include <iostream>
#include <string>
using namespace std;
void main()
{
string mystring;
while (cin>>mystring)
{
cout<<mystring<<endl;
}
}
(3)處理string對象中的字符
c++11新標準提供了一種語句:範圍for。
語法如下:
for(declaration:expression)
statement
expression部分是一個對象,用於表示一個序列。declaration是序列中的基礎元素,每次迭代回味初始化expression部分的下一個元素值。
使用範圍for語句改變字符串中的字符
如果想改變string對象中的字符的值,必須把循環變換定義成引用類型。
只處理一部分字符
兩種方法:1、使用下標; 2、使用迭代器
3.3 標準庫類型vector
標準庫類型vector表示對象的集合,其中所有對象的類型都相同。想要使用vector,必須包含適當的頭文件。
c++語言既有類模板又有函數模板,vector屬於類模板。
模板本身不是類或函數。編譯器根據模板創建類或函數的過程稱爲實例化。當使用模板時,需要指出編譯器應把類或函數實例化何種類型。
我的理解是,模板就是一種通用類型。具體用到的時候我們自己來指定具體的數據類型。
vector能容納絕大多數類型的對象作爲其元素。
(1)定義和初始化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> v5={a,b,c...}
列表初始化vector對象,用{}而不是()。
創建指定數量的元素,vector<int> ivec(10,-1);
值初始化 只提供vector對象容納的元素數量,庫會創建一個值初始化的元素初值
(2)向vector對象中添加元素
範圍for語句體內不應改變其所遍歷序列的大小
(3)其他vector操作
不能用下標形式添加元素
3.4 迭代器介紹
在c++中,對for循環中更多的使用!=進行判斷。因爲所有標準容器庫都定義了==和!=,但它們中大部分都沒有定義<運算符。
迭代器類型
我們不知道string和vector的size_type成員到底是什麼類型,一般來說我們也不知道迭代器的精確類型。一般使用iterator和const_iterator來表示迭代器的類型。
const_iterator只能讀元素,不能寫元素。如果vector和string對象是一個常量,只能使用const_iterator。
begin和end,對量是常量返回const_iterator,非常量返回iterator。
引入新的cbegin,cend不論vector對象本身是狗是常量,返回值都是const_iterator。
結合解引用和成員訪問操作
解引用迭代可獲得迭代器所指的對象。
(it).empty()//解引用it,然後調用結果對象的empty成員。
箭頭運算符->把解引用和成員訪問兩個操作結合起來。it->mem相當於*(it).mem
兩個迭代器相減得到的類型爲difference_type帶符號整數型。
3.5 數組
數組與vector結構相似,但數組的大小固定,在某些特殊的應用上性能較好,但也損失了一些靈活性。
數組聲明形如a[d],d代表維度,必須爲常量表達式。
字符數組特殊的初始化形式,可以使用字符串字面值,使用這種方式時,結尾還有一個空字符。
不允許拷貝和複製