保留矢量的值
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 13
Output : 2 13
如果代码不是那么完美,我很抱歉,我完全是初学者。我希望你能理解我的缺点。
当您从vector
erase()
时,指向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)
您正在尝试擦除当前迭代中的迭代器。
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- 为多个会话保留XPtr
- 保留对其他类的成员函数的引用
- 指针保留字符串
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 如何让 GCC/Clang 在保留标识符上出错
- 必须为 C++20 协程帧保留多少内存?
- 如何将一个窗口保留在另一个应用程序窗口的前面
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 局部变量保留函数中的值
- 保留函数指针模板参数
- 变量超出范围后如何保留向量值?
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 当为可变性配置时,boost::heap::d_ary_heap 保留的额外 std::list 的目的是什么?
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 即使在使用 delete[] 后仍保留的元素
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 将成员函数保留为未定义
- C++:如何为多个重载函数保留通用代码路径?
- C++ 删除存在于另一个矢量中的矢量项,同时保留顺序