保留矢量的值

Keeping values of vector

本文关键字:保留      更新时间:2023-10-16

我在编写程序以仅保留重复项时遇到问题,这是我已经写过的:

#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 13Output : 2 13如果代码不是那么完美,我很抱歉,我完全是初学者。我希望你能理解我的缺点。

当您从vectorerase()时,指向vector中擦除的元素或稍后的所有迭代器都将失效。幸运的是,erase()将迭代器返回到擦除元素之后的元素,因此您可以执行以下操作:

for(auto b = v.begin(), end=std::prev(v.end()); b != end;) {
if(*b != *(b+1) ) b = v.erase(b);
else              ++b;
}

请注意,您需要end()之前停止迭代一个元素,因为您执行*(b+1)

但是,上述内容不会删除除一个重复元素之外的所有元素。

另一种办法是搜索不是重复序列中的第一个元素,如果没有重复,则擦除该元素,如果该元素有重复,则删除所有重复,但

有一个重复。我在下面的示例中使用了std::find_if_not的标准算法,但您可以轻松地将其替换为执行相同操作的循环。只需搜索第一个等于*b的元素。

#include <algorithm>
for(auto b = v.begin(); b != v.end();) {
// find the first element not being a repetition of *b
auto r = std::find_if_not(b + 1, v.end(), [&b](const auto& v) { return *b==v; });
if(b + 1 == r) b = v.erase(b);        // *b had no repetitions, erase b
else           b = v.erase(b + 1, r); // erase all repetitions except one element
}

您正在尝试取消引用无效的迭代器。在第二个 for 循环的最后一次迭代中,*(b+1)将尝试取消引用此迭代器。 改变:

for(std::vector<int>::iterator b = v.begin();b<v.end();++b)

自:

for(std::vector<int>::iterator b = v.begin();b<v.end()-1;++b)

并将抹掉更改为:

v.erase(b+1)

您正在尝试擦除当前迭代中的迭代器。