C 11系列 區間迭代

2022-08-14 20:15:10 字數 2483 閱讀 2677

2013-08-20

在我前面介紹c++11的文章中,我提到c++11將會帶來一些實用的改進。我的意思是它將移除一些不必要的打字和其它影響快速編碼的壁壘。我前面講過的auto關鍵字就是乙個例子;現在我想講一下區間迭代(range-based

for loop)。

近來,基本上所有現代程式語言都有一種對乙個區間寫for迴圈的便捷方式。最終,c++也有了相同的概念;你可以給迴圈提供乙個容器,它幫你迭代。前面我們已經在什麼是c++11中看到了一些簡單的例子。讓我們回憶一下區間迭代的樣子:

vector

<

int>

vec;

vec.

push_back(10

);vec

.push_back(20

);for

(int i:

vec)

上面**列印乙個名叫vec的vector的內容,用i去捕獲vector裡面的值,直至vector的最後。你也可以用auto代替型別便利的迭代複雜的資料結構。例如,迭代乙個map:

map<

string

,string

>

address_book

;for

(auto

address_entry

:address_book

)

假如你想修改你正在迭代的容器的值,或者你想避免拷貝大物件,你可以用引用的變數遍歷。比如,下面的迭代對乙個整形vector中每個元素的值加1。

vector

<

int>

vec;

vec.

push_back(1

);vec

.push_back(2

);for

(int&i

:vec

)for

(int i:

vec)

strings,arrays,和所有的stl容器可以被新的區間迭代方式迭代。但是如果你想讓你自己的資料結構使用這個新語法怎麼辦?

為了使這個資料結構可迭代,它必須類似於stl迭代器。

就這些!實現這五個函式,你就可以有乙個支援區間迭代的資料結構。因為begin、end可以是非成員函式,你甚至可以適配現有資料結構而不用實現stl風格的迭代器。所有你要做的是建立你自己的支援*、字首++和!=的迭代器,並且定義好自己的begin、end。

區間迭代如此nice。所以我懷疑大部分還不支援stl迭代模型的容器都會想新增某種適配方式以支援區間迭代。這裡有乙個小程式演示建立乙個支援區間迭代的迭代器。這個例子裡,我建立了乙個固定size是100的intvector,並且可以被乙個叫做iter的類迭代。

#include

using

namespace

std;class

intvector

;class

iter

// 這三個方法組成支援區間迭代的迭代器的基礎

bool

operator!=(

const

iter

&other

)const

int operator*()

const

;const

iter

&operator

++()

private:

int _pos

;const

intvector

*_p_vec;};

class

intvector

intget

(int

col)

const

iter

begin

()const

iter

end()

const

void

set(

intindex

,int

val)

private:

int _data

[100

];};

intiter

::operator*()

const

intmain

()for

(int i:

v)}

注意這段**中區間迭代時,不允許以引用修改intvector中的元素。這是為了不使**變長而影響**的主要結構,所以並沒新增返回引用型別的函式。

在我使用gcc4.6的有限的測試中,我並沒看到區間迭代相對於標準stl迭代的效能提公升,但好像可以和stl中的for_each擁有同樣的效能。

不幸的是,區間迭代的編譯器支援的不好。msvc11以後開始支援,gcc是4.6以後支援。

**:

C 11 併發指南系列

本系列文章主要介紹 c 11 併發程式設計,計畫分為 9 章介紹 c 11 的併發和多執行緒程式設計,分別如下 c 11 併發指南一 c 11 多執行緒初探 本章計畫 1 2 篇,已完成 1 篇 c 11 併發指南二 std thread 詳解 本章計畫 1 2 篇,已完成 1 篇 c 11 併發指...

C 區間覆蓋(不支援C 11)

數軸上有 n 1 n 25000 個閉區間 ai,bi 選擇盡量少的區間覆蓋一條指定線段 1,t 1 t 1,000,000 覆蓋整點,即 1,2 3,4 可以覆蓋 1,4 不可能辦到輸出 1 第一行 n和t 第二行至n 1行 每一行乙個閉區間。選擇的區間的數目,不可能辦到輸出 1 3 10 1 7...

C 11迭代器失效問題分析

這個問題面試官最喜歡問了,咱們把它解決掉,非常簡單的。對於序列式容器 如vector,deque 序列式容器就是陣列式容器,刪除當前的iterator會使後面所有元素的iterator都失效。這是因為vetor,deque使用了連續分配的記憶體,刪除乙個元素導致後面所有的元素會向前移動乙個位置。所以...