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