2017-05-24 110 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