2012-12-17 49 views
2

假設我有vector<int> vals。我在迭代它並將值更改爲絕對值:我可以在迭代時修改C++容器的值嗎?

for (vector<int>::iterator it = vals.begin(); it != vals.end(); ++it) { 
    if (*it < 0) *it = -*it; 
} 

這是允許的嗎?我不會改變vector<int>的大小,所以我認爲它不會失效。我覺得我很安全。我想確認一下。

回答

8

是的,它很安全。您不會更改基礎存儲。

void doSomething(const vector<int>& vals) 

這個本網站的會談非常好:請記住,如果你在這樣的函數傳遞容器作爲const它不會工作http://www.cplusplus.com/reference/vector/vector/begin/

+0

Thenks!我不知道const &&迭代器。從站點:「**如果vector對象是const限定的,函數('begin()')返回一個const_iterator,否則返回一個迭代器。**」 – bodacydo

+0

是的。它允許你在'const'之後寫入.begin和.end,並且仍然有效。然而,當你嘗試使用'const_iterator'爲一個元素賦值時,你的編譯器會對你大吼。這延伸到容器中的類,其中類方法聲明爲「const」,或者如果使用'const_iterator'則無關緊要。 – dlp

2

它是安全的,並允許序列容器(例如,array,vectordeque)。

對於setmultiset,不允許修改(儘管編譯器可能不會拒絕嘗試這樣做的代碼)。

對於mapmultimap,您必須將該密鑰視爲常量,但可以修改與該密鑰關聯的值(同樣適用於​​變體)。

順便說一句,你可能要代替循環的考慮算法您在上面使用:

std::transform(vals.begin(), vals.end(), vals.begin(), ::std::abs); 
+0

我很擔心修改像int這樣的固定大小的類型的結構與像字符串這樣的可變大小類型之間的區別。就像,如果我有一個矢量,甚至是一個由字符串組成的映射,並且我將一個值設置爲一個更大的字符串,看起來它可能導致整個容器重新分配或轉移,使指針/迭代器無效。你能指點我到一個官方的地方嗎?它說迭代器必須保持有效,即使你改變了一個值的大小? –

相關問題