w.erase(unique_copy(v.begin(),v.end(),w.begin())); 中的参数在哪里 指着?

Mat*_*iem 0 c++

我正在学习 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())”会指向哪个位置?(如果我使用的术语不正确,再次抱歉)

感谢您的帮助!

Ala*_*les 5

代码中有很多问题,但首先回答你的问题,如果我们添加一个临时变量,就更容易解释:

auto end = unique_copy(v.begin(),v.end(),w.begin());
w.erase(end);
Run Code Online (Sandbox Code Playgroud)

std::unique_copyw返回一个迭代器,指向由写入的最后一个元素之后的一个unique_copyw.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)