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使用了連續分配的記憶體,刪除乙個元素導致後面所有的元素會向前移動乙個位置。所以...