C++ 当尝试从向量中删除元素时,若使用另一个变量作为值而不是直接向量索引,则答案不同

C++ 当尝试从向量中删除元素时,若使用另一个变量作为值而不是直接向量索引,则答案不同,c++,vector,C++,Vector,我是一个初学者,我被困在这里,即使val=vec[0],为什么答案会不同。如果有任何帮助,我们将不胜感激。提前谢谢 vector<int>vec; vec={1,2,1,3,1,3}; int val=vec[0]; vec.erase(remove(vec.begin(),vec.end(),val),vec.end()); for(auto it=vec.begin();it!=vec.end();it++) { cout<

我是一个初学者,我被困在这里,即使val=vec[0],为什么答案会不同。如果有任何帮助,我们将不胜感激。提前谢谢

vector<int>vec;
vec={1,2,1,3,1,3};

int val=vec[0];
   vec.erase(remove(vec.begin(),vec.end(),val),vec.end());
         for(auto it=vec.begin();it!=vec.end();it++)
    {
        cout<<*it<<" ";
    }
//Output:2 3 3

//Now if we change val to vec[0] then output changes.

vec={1,2,1,3,1,3};
   vec.erase(remove(vec.begin(),vec.end(),vec[0]),vec.end());
         for(auto it=vec.begin();it!=vec.end();it++)
    {
        cout<<*it<<" ";
    }
//Output:2 1 3 1 3
vectorvec;
vec={1,2,1,3,1,3};
int val=vec[0];
删除(删除(vec.begin(),vec.end(),val),vec.end());
for(auto it=vec.begin();it!=vec.end();it++)
{
cout通过引用获取要删除的值,并对范围内的元素执行修改(移位)。这意味着作为
vec[0]
传递的范围内的元素可能会被修改,然后不会给出预期的最终结果

因为std::remove通过引用获取值,所以如果它是对范围为[first,last]的元素的引用,它可能会有意外的行为


您说这两个实例中的输出都是
23
。我假设其中一个应该是不同的…?
std::remove
引用值,而不是副本。当引用是被操纵向量的元素时,它的值会从函数下更改。@NathanPierson我真的很抱歉,现在我有了编辑了片段第二部分的输出。(2,1,3,1,3)@IgorTandetnik但它们不是都指向同一个值吗?@IgorTandetnik好的,现在明白你的意思了。谢谢..!!哦,明白了。非常感谢