2010-02-04 127 views
10

我讀到這裏和其他地方,使用的索引,你應該迭代一個std :: vector的時候:迭代多的std ::矢量

std::vector <int> x(20,1); 
for (std::vector<int>::size_type i = 0; i < x.size(); i++){ 
    x[i]+=3; 
} 

但如果你迭代的兩種不同類型的載體是什麼:

std::vector <int> x(20,1); 
std::vector <double> y(20,1.0); 
for (std::vector<int>::size_type i = 0; i < x.size(); i++){ 
    x[i]+=3; 
    y[i]+=3.0; 
} 

它是安全的假設,

std::vector<int>::size_type

爲鄰f與

相同
std::vector<double>::size_type 

僅僅使用std :: size_t會安全嗎?

謝謝。

+0

喜歡這,你被教導錯了。除了任何體面的編譯器應該優化爲'++ i'的'i ++'之外,你仍然可以調用'x。size()'在循環的每一個循環中,如果它是非平凡的而不是inline是浪費的。 – 2010-02-04 17:49:46

+0

@Matthieu,只是一個快速和骯髒的例子來說明我的問題。我也應該使用迭代器,而不是通過索引來完成。 – Mark 2010-02-04 19:09:41

回答

7

是的,幾乎任何實際的目的,你可以使用std :: size_t。雖然有一種意圖,即不同的容器可以使用不同類型的大小,但基本上保證(至少對於標準容器)size_type與size_t相同。

或者,你可以考慮使用一種算法,是這樣的:

std::transform(x.begin(), x.end(), x.begin(), std::bind2nd(std::plus<int>(), 3)); 
std::transform(y.begin(), y.end(), y.begin(), std::bind2nd(std::plus<double>(), 3.0)); 
2

一般來說,C++標準並沒有給出這樣的保證:對於不同的參數化容器既不相等size_types也不等於size_t。

+0

+1。你是對的,'std :: size_t'保證只適用於分配器。我以爲'std :: vector :: size_type'必須等於'Allocator :: size_type',但顯然不是。 – avakar 2010-02-04 15:05:26

+0

@avakar:情況是標準分配器對size_type使用size_t,並且標準容器的所有已知實現都通過來自其關聯分配器的size_type。因此,除非你編寫自己的分配器,否則將會是size_t。從實踐的角度來看,size_t基本上總是能夠工作,不管它們用作size_type - 例如':: operator new'使用size_t作爲分配的大小,並且基本上所有其他分配都通過它(至少默認情況下)。 – 2010-02-04 15:13:22

1

嗯,我認爲:

for (std::vector<int>::size_type i = 0; i < x.size(); i++){ 

是一個完美的理事會的東西 - 你期待你的向量真的很巨大?就個人而言,我使用unsigned int,沒有問題。

,我現在估計的downvotes將開始...

+0

@尼爾,愛「完美理事會」。我正在使用unsigned int,但閱讀這樣的東西:http://stackoverflow.com/questions/409348/iteration-over-vector-in-c,讓我們擔心。可能不需要的擔心。 – Mark 2010-02-04 15:08:44

+0

@Neil:你永遠不會活那麼久 - 沒有人想被責備完美主義者我猜:-D – 2010-02-04 15:10:52

+2

@Mark如果你使用的是無符號類型,你沒問題,恕我直言。 litb對你所關聯問題的回答是(當然)是正確的,但是你真的很喜歡使用size_type來打字(用兩種方式)。 – 2010-02-04 15:12:16

2

我想你可以安全地假設size_type是一個無符號整數非負。除此之外,你不能太依賴。當然,大多數容器都有size_type,這與size_t相同,但沒有保證。

SGI文檔和此源http://www.cplusplus.com/reference/stl/vector/似乎在這一點上達成一致。

你也可以看看這個解決方案爲您的問題:http://rosettacode.org/wiki/Loop_over_multiple_arrays_simultaneously#C.2B.2B

我希望這有助於。

+0

@batbrat,很好的鏈接到rosettacode,非常有幫助。 – Mark 2010-02-04 15:20:14

+0

很高興幫助! – batbrat 2010-02-04 15:25:52

-1

您應該使用迭代器代替

std::vector <int> x(20,1); 
std::vector <double> y(20,1.0); 
std::vector<double>::iterator j = y.begin(); 
for (std::vector<int>::iterator i = x.begin(); i != x.end(); ++i){ 
    *i +=3; 
    *j +=3.0; 
    ++j; 
} 

因爲如果你已經教給迭代沒有保證,美SIZE_TYPE是相同的內部類型,反正對於std::vector你可以重複使用unsigned int

+1

爲什麼不在控制體中增加'j'?而且你也因爲沒有使用'max'或'end'變量來檢查迭代的結束......真的堅持用'for_each'; – 2010-02-04 17:54:15

+0

@MatthieuM,你如何在需要遍歷兩個時使用foreach不同的載體?顯然,這個例子是陳舊的,循環可以分開,我想不出一種辦法來做x [i] = y [i] + 3 – 2010-03-01 10:54:44