我正在学习 C++ 的一门大学课程,我有一个问题,但我不知道如何表达它,所以可能在某个地方有一个与此类似的问题,但我找不到它。如果这篇文章碰巧是重复的,请重定向我!另外,英语不是我的母语,请原谅我的法语。
关于我的问题:
我们得到了这个代码:
vector<int> v{1,1,2,2,2,3,4,4,3,3,2};
vector<int> w(8);
w.erase(unique_copy(v.begin(),v.end(),w.begin()));
for (int e: w) cout << e << ' ';
Run Code Online (Sandbox Code Playgroud)
我认为 w.erase(x) 中的参数应该从位置 x 或元素范围中删除单个元素。
但我不明白“unique_copy(v.begin(),v.end(),w.begin())”会指向哪个位置?(如果我使用的术语不正确,再次抱歉)
感谢您的帮助!
代码中有很多问题,但首先回答你的问题,如果我们添加一个临时变量,就更容易解释:
auto end = unique_copy(v.begin(),v.end(),w.begin());
w.erase(end);
Run Code Online (Sandbox Code Playgroud)
std::unique_copyw返回一个迭代器,指向由写入的最后一个元素之后的一个unique_copy。w.erase(end)然后仅删除该元素。您真正想要做的是删除end此后的所有元素。正确的代码是w.erase(end, w.end()).
仍然存在一个问题,std::unique_copy可能会尝试编写比内部容纳的更多的元素w。在这种特殊情况下,w碰巧足够大,但为了更安全(并避免必须调用erase),最好使用std::back_inserter:
std::vector<int> v{1,1,2,2,2,3,4,4,3,3,2};
std::vector<int> w;
std::unique_copy(v.begin(),v.end(),std::back_inserter(w));
Run Code Online (Sandbox Code Playgroud)