2017-05-24 48 views
-1

正如標題所解釋的,我出於某種原因在不同類型的向量(即字符串和整數)上使用std :: remove獲得了不同的結果。對於整數矢量,函數按預期工作,而不是實際上物理刪除元素。然而,它確實在物理上刪除了字符串向量的元素,我似乎無法弄清楚爲什麼(感覺像是我忽略的小事)。如果任何人都可以解釋爲什麼這會發生,那真是太棒了。我已經發布了下面的代碼和輸出。謝謝!std :: remove不同類型的向量的不同結果

//includes 
using namespace std; 

template <class T> 
void printer(T value) { 
    cout << value << ", " 
} 

int main() { 
    string myvalues[] = { "yyy","Yyy", "yYy","yyY","ZZZ","zZZ", "ZzZ", "ZZz" }; 
    int nums[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; 
    vector<string> v1(myvalues, myvalues + 8); 
    vector<int> v2(nums, nums + 8); 
    sort(v1.begin(), v1.end()); 
    remove(v2.begin(), v2.end(), 7); 
    remove(v1.begin(), v1.end(), "yyy"); 
    for_each(v1.begin(), v1.end(), printer<string>); 
    cout << endl; 
    for_each(v2.begin(), v2.end(), printer<int>); 

    return 0; 
} 

輸出:

YYY,ZZZ,ZZZ,ZZZ,YYY,YYY,ZZZ,

1,2,3,4,5,6,8,8,

正如你所看到的,元素「yyy」實際上被移除了,最後一個元素爲空,而元素「7」在邏輯上被移除,而最後一個元素保持不變。

+1

後編譯代碼。 –

+2

聳聳肩。一旦你刪除了一個元素,你的序列就更小了,而且你不應該超越它的結尾。 –

+0

你注意到了輸出中的雙逗號嗎? – rustyx

回答

1

性病的參考::刪除:

沒有被去掉保留的元素的相對順序,而返回的迭代和最後的 元素被留在一個有效的 但不確定狀態。

因此,在這兩種情況下,函數的行爲都是「正確的」。

+0

不確定爲什麼int和字符串之間的差異。字符串的實現可能是用空字符串進行某種交換,而對於int來說,只是分配下一個值? – user1620443