std :: remove在不同类型的向量上的结果不同

时间:2017-05-24 17:30:22

标签: c++ vector std

正如标题所解释的那样,我出于某种原因使用std :: remove在不同类型的向量上获得不同的结果,即字符串和整数。对于int的向量,函数按预期工作,而不是实际上物理删除元素。然而,它实际上删除了字符串向量的元素,我似乎无法弄清楚为什么(感觉它是我忽略的小东西)。如果有人能解释为什么会发生这种情况真的很棒。我已经发布了下面的代码和输出。谢谢!

//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 个答案:

答案 0 :(得分:1)

来自std :: remove的参考:

  

保留未删除元素的相对顺序,而   返回的迭代器和last之间的元素保留为有效   但未说明的状态。

因此,在这两种情况下,该功能都表现正确&#34;。