C Primer 筆記十二 初識 vector

2021-09-12 05:25:22 字數 4425 閱讀 6120

標準庫型別vector表示型別相同的物件的集合,因之可以容納其他物件,也被稱作容器(container)。引用不是物件,因此不存在引用的 vector 。

同 string 一樣,vector 也是對陣列的某種抽象。

初始化

vector 是c++ 的乙個類模板而非型別,編譯器根據模板建立類或者函式的過程稱為例項化,因此由 vector 生成的型別必須包含 vector 中元素的型別:

vector<

int> ivec;

// 包含元素型別為int

vector> file;

// 包含元素型別為 vector

vector 物件常用的初始化方法:

vector v1;

// vector 的元素型別為 t,元素執行預設初始化

// 這是最常見的方式

vector

v2(v1)

;// v2 中包含 v1 中所有元素的副本,

// v2 和 v1 的元素型別必須相同

vector v3 = v2;

// 等價與 vectorv3(v2)

vector

v4(n, val)

;// v4 包含 n 個元素,每個元素的值為 val

vector

v5(n)

;// v5 包含了 n 個執行了 值初始化 的元素

vector v6

;// v6 包含了初始值個數的元素,這裡是 4,

// 每個元素的的值被賦予相應的初始值

vector v7 =

;// 等價於 vectorv7

值初始化發生在只提供 vector 物件容納的元素數量而略去初始值的時候,庫會根據元素型別來決定賦給元素的初值,如果 vector 中元素是內建型別,則元素初始值自動設為 0 ;如果是類型別,則由類預設初始化。

值初始化的兩個特殊限制:1. 對於要求明確提供初始值的類,必須提供初始的元素值,否則無法完成初始化工作;2. 只提供了元素數量而沒有設定初始值,只能使用直接初始化。

// 下面操作將引發錯誤

// error: conversion from 『int』 to non-scalar type

// 『std::vector』 requested

vector<

int> v1 =

10;

vector 物件的操作函式

效果v.empty()

v 為空的時候返回真;否則為假

v.size()

返回 v 中元素的個數

v.push_back(t)

在 v 的尾端新增乙個值為 t 的元素

v[n]

返回 v 中第 n 個位置上元素的引用

v1 = v2

用 v2 中元素的拷貝替換 v1 中的元素

v1 =

用列表中的元素的拷貝替換 v1 中的元素

v1 == v2

v1 和 v2 相等當且僅當它們的元素數量相同且對應位置的元素值都相同

v1 != v2

同上<, <=, >, >=

以字典順序進行比較

最常見的情況是,建立了乙個空的 vector,然後使用成員函式push_back()向 vector 的尾部新增元素。

// 建立乙個 vector 物件,包含 100 個型別為 int 的元素

// 元素的值從 1 ~ 100

vector<

int> ivec;

for(

int i =

0; i !=

100;

++i)

可以通過下標訪問 vector 中的元素:

// 對於上面的 ivec

cout << ivec[4]

<< endl;

// 輸出 5

類似 string,vector 的下標起始於 0,型別為 size_type,由 vector 定義,同 vector 物件的宣告一樣,使用 size_type 必須指定它的型別:

vector<

int>

::size_type i;

// ok

// 下面操作將引發錯誤

// error: 『templateclass std::vector』

// used without template parameters

vector::size_type i2;

下標的合法範圍在 0 到 size() - 1 之間,size() 函式返回 vector 物件中元素的個數,型別為 size_type,不能通過下標形式新增元素:

// 編譯器不負責檢測下標的合法性

// 編譯通過,但在執行是引發錯誤

// 緩衝區溢位

vector<

int> ivec;

ivec[0]

=4;// error

兩個練習:

練習 3.16: 從 cin 讀入一組詞,並把它們存入乙個 vector 物件,然後設法把所有詞都改寫為大寫形式。輸出改變後的結果,每個詞佔一行。

// toup.cc

// p94 exercise 3.17

#include

#include

using

namespace std;

intmain()

for(

auto

&str : sver)

}for

(int i =

0; i != sver.

size()

;++i)

return0;

}

$ ./toup.out 

when you are old and grey and full of sleep

when

youare

oldand

grey

andfull

ofsleep

練習 3. 20: 讀入一組整數,並把它們存入乙個 vector 物件,將每對相鄰整數的和輸出。改寫程式,要求輸出第乙個和最後乙個元素的和,接著輸出第二個和倒數第二個元素的和,以此類推。

// add.cc

// p94 exercise 3.20

#include

#include

// 通過型別別名避免多次宣告複雜的型別

using type = std::vector<

int>

::size_type;

intmain()

type size = ivec.

size()

; std::cout <<

"size of ivec : "

<< size << std::endl << std::endl;

// 列印相鄰元素的和

for(type i =

0; i != size -1;

++i)

std::cout << std::endl;

// 列印首尾對稱位置的和

// decltype() 返回變數的型別

// 這裡 i 的型別是 vector::size_type

for(

decltype

(size) i =

0; i != size /2+

1;++i)

return0;

}

$ ./add.out 

11 22 33 44 55 66 77 88 99

esize of ivec : 9

ivec[0] + ivec[1] = 33

ivec[1] + ivec[2] = 55

ivec[2] + ivec[3] = 77

ivec[3] + ivec[4] = 99

ivec[4] + ivec[5] = 121

ivec[5] + ivec[6] = 143

ivec[6] + ivec[7] = 165

ivec[7] + ivec[8] = 187

ivec[0] + ivec[8] = 110

ivec[1] + ivec[7] = 110

ivec[2] + ivec[6] = 110

ivec[3] + ivec[5] = 110

ivec[4] + ivec[4] = 110

好好學習天天向上~~╭(●`∀´●)╯ ヾ(*´▽『*)ノ ~~

c primer 讀書筆記十二

指標運算 給乙個指標加上減去某個整數值,結果任然是指標,新元素指向的元素與原來的指標相比前進 後退了 該整數值個位置 constexpr size t sz 5 int arr sz int ip arr int ip2 ip 4 ip2指向arr的尾元素arr 4 針超出了上述範圍就將產生錯誤,這...

C Primer 學習筆記 關聯容器初識

關聯容器中元素按照關鍵字來訪問和儲存 map key value對 字典中單詞是key,單詞釋義是value 關聯陣列,set 只儲存關鍵字 multimap multiset 允許多個元素具有相同的關鍵字 map map map words string word while cin word f...

c primer學習筆記 初識泛型演算法

1概述 大多數演算法定義在標頭檔案algorithm中。一般情況下,這些演算法並不直接操作容器,而是遍歷迭代器指定的元素範圍。2迭代器使演算法不依賴於容器執行 雖然迭代器使用令演算法不依賴於容器型別,但大多數演算法都使用了乙個 或者多個 元素型別上的操作。關鍵在於 泛型演算法本身不會執行容器操作,只...