2012-09-28 98 views
4

我是否認爲這個無辜的代碼相當危險?插入向量

template<typename T> 
void insertLast(std::vector<T>& v) 
{ 
    if(v.empty()) return; 
    v.insert(v.begin(), v.back()); 
} 

讀一些答案後,一些澄清..

好吧,我不是真的問如何插入元素爲載體,但我做了一個假的情況下審訊的原則。在換句話說你認爲有必要進行復制(這裏暫時被創建..和const引用到一個臨時被保證住):

template<typename T> 
void insertLast(std::vector<T>& v) 
{ 
    if(v.empty()) return; 
    v.insert(v.begin(), T(v.back())); 
} 
+7

它不會編譯,因爲你不能在'const'引用上調用'insert'。那是你認爲危險的嗎? –

+2

它也需要'typename T'來編譯。 – Benj

+1

你是不是會把'back'和'end'混淆?它是一個簡單的錯誤,但完全改變了代碼的含義 – jozefg

回答

1

假設您解決在評論中提到的兩個點,使這個編譯,這將會運行,但會留下加爾巴由於vector.back()返回參考,所以每次運行矢量前面的ge值。

它看起來像這樣什麼是試圖做的是以下幾點:

template<typename T> 
void insertLast(std::vector<T>& v) 
{ 
    if(v.empty()) return; 
    v.insert(v.begin(), v.end() - 1, v.end()); 
} 

這將安全地插入的最後一個元素的載體中,使得它也是第一個元素....假設是期望行爲。

2

看來危險向我以及因爲vector.back()返回參考,並且在比該載體端的其它位置

插入通過移動所有位置和載體的端部之間的元件執行他們的新位置,然後插入新元素(一個或多個) (從here

除非我誤解,引用傳遞insert變成「無效」(如果沒有重新分配情況,它可以包含不是最後一個元素,但以前; oth否則它仍然可能是正確的,但我想這不能保證。

在某些情況下,有可能某些優化器可能會隱藏錯誤(我猜它永遠不會發生在對象上,但可能會發生在基元上),所以您會得到預期的結果,但總的來說我不會依賴這種行爲。