迭代集合并集的干净方法
clean way to iterate over union of sets ?
我有 2 个 std::set 实例,例如,一个实例对应于时间 t 处的集合状态,另一个实例对应于 t+1 处的集合状态。
我想迭代这两个集合的并集(在数学意义上(,这样:
- 联合的每个元素处理一次
- 对于每个元素,我可以在恒定的时间内判断它是在第一组、第二组还是两者中
这是我目前正在做的事情的一个例子:
std::set<A> old_set, new_set;
for(auto it = old_set.begin(); it != old_set.end(); ++it) {
if(new_set.count(*it) == 0) {
//only in old set but not in new set
}
}
for(auto it = new_set.begin(); it != new_set.end(); ++it) {
if(old_set.count(*it) == 0) {
//only in new set but not in old set
}
}
如您所见,它缺少我们在两个集合中处理元素的部分,而且复杂性也不够好。我认为应该有一种方法可以通过简单地迭代集合的所有元素来做我想做的事情
有人有想法吗?
谢谢
你可以做这样的事情:
template <typename T, typename D>
void iterate(std::set<T>& s1, std::set<T>& s2, D d)
{
auto it1 = s1.begin();
auto it2 = s2.begin();
while (it1 != s1.end() && it2 != s2.end()) {
if (*it1 < *it2) {
// only in set1
d.visit1(*it1);
++it1;
} else if (*it2 < *it1) {
// only in set2
d.visit2(*it2);
++it2;
} else {
// in both
d.visitboth(*it1, *it2);
++it1;
++it2;
}
}
for (; it1 != s1.end(); ++it1) {
// only in set1
d.visit1(*it1);
}
for (; it2 != s2.end(); ++it2) {
// only in set2
d.visit2(*it2);
}
}
在所有这些计数之后,在快速容器(如std::vector
(中创建联合并迭代它可能更有效:
int main()
{
std::set<int> s1 {1, 2, 4, 6, 9};
std::set<int> s2 {2, 3, 4, 6, 11};
std::vector<int> u;
u.reserve(s1.size() + s2.size());
std::set_union(s1.begin(), s1.end(), s2.begin(), s2.end()
, std::back_inserter(u));
for(auto it = u.begin(); it != u.end(); ++it)
{
// do stuff on union
std::cout << "u: " << *it << 'n';
}
}
一个想法是编写自己的迭代器,它可以对容器执行迭代并以这种方式合并它们:
template<typename... T>
class MergeIterator{
MergeIterator( T... constainers ):m_containers(std::forward(containers)...){}
std::tuple< T... > m_containers;
/// implement the operators here.
MergeIterator operator ++(){///... here switch the tuple if needed until it is not on the last element}
};
为简单起见,您可以使用 std::vector
同时迭代两个或多个容器的最佳方法是什么
相关文章:
- 处理多个异常集合的C++方法
- 保留计时器集合(对象与指针)的最佳方法
- 查询数据库以在 C++ 中创建自定义类集合的最佳方法
- 为什么以相同的数量插入到集合中,基于不同的方法具有不同的运行时间?
- 有没有一种单行方法来调用集合上的 lambda 函数
- 对集合调用成员方法
- 在C 中,有一种惯用方法来防止运行一系列动作的情况导致该集合被突变
- 在集合方法中传递 get 方法
- C++集合方法:函数'setCost'不可行:'this'参数的类型'const value_type'
- 方法插入到任何stl集合中
- 模板集合的不同排序方法
- 位掩码:通过集合方法设置对象的不同状态
- 从集合中随机给定整数 0、1 和 2 时获取整数 0、1 和 2 的快速方法
- 支持多线程方法来构建数组中所有元素的集合吗
- 在 c++ 中搜索集合的最有效方法是什么
- 找到集合并集的最快方法
- STL 集合的插入方法是否复制传递对象的值?
- 对基于地图C++集合重新排序的有效方法
- 如何使用提升 lambda 对集合中的每个元素调用方法?
- 迭代集合并集的干净方法