【C++ primer學習】第三章 字符串、向量和數組

這一章節感覺挺重要的,刷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)
    把所讀的內容存到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代表維度,必須爲常量表達式。

字符數組特殊的初始化形式,可以使用字符串字面值,使用這種方式時,結尾還有一個空字符。

不允許拷貝和複製

 

 

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