C++ C++;,将值赋给vector::end?

C++ C++;,将值赋给vector::end?,c++,vector,iterator,C++,Vector,Iterator,假设我有一个向量v{1,2,3,4,5}。我想删掉最后两个元素,所以我想我应该做如下的事情 v.end() = v.begin() + 3; 让我们看一下这个片段: std::vector<int> v {1,2,3,4,5}; std::cout << *(v.end()-1) << std::endl; v.end() = v.begin() + 3; std::cout << *(v.end()-1) << std::endl;

假设我有一个向量v{1,2,3,4,5}。我想删掉最后两个元素,所以我想我应该做如下的事情

v.end() = v.begin() + 3;
让我们看一下这个片段:

std::vector<int> v {1,2,3,4,5};
std::cout << *(v.end()-1) << std::endl;
v.end() = v.begin() + 3;
std::cout << *(v.end()-1) << std::endl;
std::向量v{1,2,3,4,5};

std::cout每次调用
v.end()
,都会返回一个新的迭代器对象。这是一个右值,但您仍然可以更改其值,但这对容器(您的
v
)没有任何影响。
如果要从向量中删除某些内容,请使用例如
vector::erase()

您不能指定需要删除的结束迭代器

v.erase(v.begin() + 3, v.end());
std::end()
返回一个迭代器,该迭代器指向最后一个迭代器之后的元素。它只能用作引用(例如,将另一个迭代器与它进行比较),尝试使用它的值是未定义的行为

也就是说,这个代码
v.end()=v.begin()+3
只是重新定位从向量获得的迭代器副本,它不会修改向量本身


考虑使用一个重载来切掉向量的一部分。

我想你的意思是它是一个右值。嗯,不是吗?它是一个对象(类型迭代器),它占用内存,您可以给它赋值-->它是左值。它是右值<代码> v()/代码>是一个RValk表达式(可以通过编写几个函数来轻松地检查,< C++ > ValueFoo(const vector::迭代器);< /COD>和无效VoO(vector::迭代器& &)< /Cord>,看看哪一个结果会超载。)我想R或L值对于C++来说太简单了。那么Xvalue呢?好的,将其更改为右值。如果您想知道是否可以分配给右值,您应该使用一个不太容易混淆的示例。如果你想知道如何从向量中“剪切最后两个元素”,那么也许你可以去掉右值。这两个问题互相妨碍,使问题变得不清楚。好吧,我以后会记住这一点,thanks@juanchopanza:这句话不完全公平。你必须假设有问题的人没有完全理解问题,这毕竟是他们问问题的原因。如果您在C++级别上提出了上面的代码,那么期望知道LWORD和rValk的更精细点是不合理的。所以你可能会看到它失败了,然后开始思考发生了什么,最后得出上面的问题。考虑到它是真正的可编译代码,具有预期和实际的结果,我认为它适合StackOverflow。