【发布时间】:2020-06-03 18:43:10
【问题描述】:
我在编写一个只保留重复项的程序时遇到了麻烦,这是我已经写过的:
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> v;
for (int n; std::cin >> n;)
{v.push_back(n); }
std::sort(v.begin(),v.end());
for(std::vector<int>::iterator b = v.begin();b<v.end();++b)
{
if(*b != *(b+1) )
{
v.erase(b);
}
}
for(std::vector<int>::iterator i = v.begin();i < v.end();++i)
{
std::cout<<*i<<" ";
}
}
我所说的“保持重复”的意思是例如Input: 13 7 2 13 5 2 1 13
Output : 2 13
如果代码不是那么完美,我很抱歉,我完全是初学者。希望你能理解我的困难。
【问题讨论】:
-
迭代器失效的经典案例。最好的办法是从向量的末尾一直工作到开头。
-
你的意思是,切换开始和结束?
-
老兄,你认为取出后剩下的元素会发生什么?他们都移回了一个地方。所以
++b会做坏事。 -
你需要把你的调试器拿出来自己看看。 3小时不算什么。 3年是博士学位。
-
@Theooc 尝试使用它而不是您正在擦除元素的循环。
auto last = v.begin(); for (auto b = v.begin(); b < v.end() - 1; ++b) if (*b == *(b + 1) && (*b == *last || *b != *(last - 1))) *last++ = *b; v.erase(last, v.end());Here is full code.
标签: c++