从矢量的矢量中移除重叠
Remove overlap from vectors of vectors
本文关键字:重叠 更新时间:2023-10-16
我所做的基本上是集覆盖问题,从具有相同数字的向量中删除重复项。一个例子:
我有以下矢量的矢量排序后:
{{1,2,3,4,5},{2,3,7,8},{10,11,12}}
现在,我想从2nd
向量中删除出现,它是2,3
,然后重新排序。。。
{{1,2,3,4,5},{10,11,12},{7,8}}
我已经实现了一些代码来对向量的向量进行排序,但我在从大小较小的向量中删除出现的内容时遇到了问题?
分拣功能:
sort(ROWS.begin(),ROWS.end(),VectorsSort());
谢谢你的帮助。
把它拆开,拿走你需要的:
#include <algorithm>
#include <vector>
struct binary_search_pred
{
typedef bool result_type;
explicit binary_search_pred(std::vector<int> const& v) : v_(&v) { }
bool operator ()(int const& i) const
{
return std::binary_search(v_->begin(), v_->end(), i);
}
private:
std::vector<int> const* v_;
};
struct size_comparison_desc
{
typedef bool result_type;
typedef std::vector<int> const& arg_t;
bool operator ()(arg_t a, arg_t b) const
{
return b.size() < a.size();
}
};
void set_cover(std::vector<std::vector<int> >& vec)
{
typedef std::vector<std::vector<int> > vec_t;
typedef vec_t::iterator iter_t;
typedef vec_t::const_iterator citer_t;
if (vec.empty() || vec.size() == 1)
return;
for (iter_t v = vec.begin() + 1, v_end = vec.end(); v != v_end; ++v)
for (citer_t p = vec.begin(); p != v; ++p)
v->erase(
std::remove_if(v->begin(), v->end(), binary_search_pred(*p)),
v->end()
);
std::sort(vec.begin(), vec.end(), size_comparison_desc());
}
(注意,set_cover
要求给定的包含的std::vector<int>
必须已经排序。)
编辑#1:
正如现已删除的评论中所要求的,一个围绕std::map<int, std::vector<int>>
而不是std::vector<std::vector<int>>
的版本(使用原始代码中的binary_search_pred
):
#include <algorithm>
#include <map>
#include <vector>
void set_cover(std::map<int, std::vector<int> >& m)
{
typedef std::map<int, std::vector<int> > map_t;
typedef map_t::iterator iter_t;
typedef map_t::const_iterator citer_t;
if (m.empty() || m.size() == 1)
return;
for (iter_t v = ++m.begin(), v_end = m.end(); v != v_end; ++v)
for (citer_t p = m.begin(); p != v; ++p)
v->second.erase(
std::remove_if(
v->second.begin(),
v->second.end(),
binary_search_pred(p->second)
),
v->second.end()
);
}
请注意,这里的map
将始终按其关键字排序,而不是按所包含的vector
的大小排序(这似乎是您想要的)。也许你想要std::vector<std::pair<int, std::vector<int>>>
?
编辑#2:
正如现已删除的评论中所要求的,一个围绕std::vector<std::pair<int, std::vector<int>>>
而不是std::map<int, std::vector<int>>
的版本(使用原始代码中的binary_search_pred
):
#include <algorithm>
#include <utility>
#include <vector>
struct size_comparison_desc
{
typedef bool result_type;
typedef std::pair<int, std::vector<int> > const& arg_t;
bool operator ()(arg_t a, arg_t b) const
{
return b.second.size() < a.second.size();
}
};
void set_cover(std::vector<std::pair<int, std::vector<int> > >& vec)
{
typedef std::vector<std::pair<int, std::vector<int> > > vec_t;
typedef vec_t::iterator iter_t;
typedef vec_t::const_iterator citer_t;
if (vec.empty() || vec.size() == 1)
return;
for (iter_t v = vec.begin() + 1, v_end = vec.end(); v != v_end; ++v)
for (citer_t p = vec.begin(); p != v; ++p)
v->second.erase(
std::remove_if(
v->second.begin(),
v->second.end(),
binary_search_pred(p->second)
),
v->second.end()
);
std::sort(vec.begin(), vec.end(), size_comparison_desc());
}
-
您不需要定义向量排序谓词。Vector已经定义了一个基于CCD_ 15的CCD_。
-
这就是你的意思吗?
std::for_each(rows.begin(), rows.end(), [](std::vector<int>& row) {
row.erase(std::remove_if(row.begin(), row.end(), [](int number) -> bool {
return (number == 2) || (number == 3);
}), row.end());
});
相关文章:
- Ardunio UNO解决了多个重叠的定时器循环
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 算术序列与区间的最大重叠
- 按顺序声明的字符数组重叠
- 拆分重叠段
- 纹理单位重叠?渲染了错误的纹理
- 什么可以防止类中相邻成员重叠
- 对多个(可能)重叠范围进行分区的最简单算法
- 英特尔将指令存储在重叠的内存区域
- 我可以在同一条链上生成多个协程而不会重叠吗?
- 使用迭代器 C++ 删除矢量中的重叠字符串
- USB-HID 读/写(重叠)等待单个对象不返回C++
- 如何在opencv C++中合并重叠的矩形?
- 如何在c/c++中检查两个任意内存范围是否重叠
- 为什么重复的空基存储不与 vtable 指针重叠?
- Qt-grabtoimage()和scale生成两个重叠的图像
- 使用命名管道块的读取文件,尽管使用重叠
- 视觉C++合并重叠的字符串
- 非重叠连续子数组的最大长度总和
- std::copy,std::copy_backward和重叠范围