Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在不同类型的向量上使用std::remove获得不同的结果_C++_Vector_Std - Fatal编程技术网

C++ 在不同类型的向量上使用std::remove获得不同的结果

C++ 在不同类型的向量上使用std::remove获得不同的结果,c++,vector,std,C++,Vector,Std,正如标题所解释的,出于某种原因,我在不同类型的向量(即字符串和int)上使用std::remove得到了不同的结果。对于int向量,函数按预期工作,而不是实际移除元素。然而,它实际上删除了字符串向量的元素,我似乎不明白为什么(感觉它是我忽略的小东西)。如果有人能解释为什么会发生这种情况,那就太好了。我已经在下面发布了代码和输出。谢谢 //includes using namespace std; template <class T> void printer(T value) {

正如标题所解释的,出于某种原因,我在不同类型的向量(即字符串和int)上使用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;
}
//包括
使用名称空间std;
模板
无效打印机(T值){

从std::remove的参考中可以看出:

未删除的元素的相对顺序将保留,而 返回的迭代器和最后一个迭代器之间的元素保留在有效的 但未指明状态


因此,在这两种情况下,函数的行为都“正确”.

Post Compiled code.Shrug。删除元素后,序列会变小,不应超出其结尾。您注意到输出中的双逗号了吗?确实没有发现这是完全重复的,但可以。只是混淆了字符串向量结尾的元素被更改(更改为空字符串)删除后,它们在int、double等向量中保持不变。但不确定int和string之间的差异是什么。可能string的实现是使用某种类型的交换来处理空字符串,而int的实现只是分配下一个值?