我需要有一个只能包含每个类的一个实例的集合(或任何其他数据结构)。 例如: 我有一个接口A,并且有一个实现它的A1。
我有代码:
std::set<A> myset;
A1 a1;
A1 a11;
myset.insert(a1); // should insert
myset.insert(a11);// should not insert
我希望a11
不在集合中。
我本来想用自定义比较器来做的,但是我不知道如何实现这个比较器。
有什么想法吗?
答案 0 :(得分:6)
您似乎认为tuple
是一个异类容器,例如pair
或struct Base { virtual ~Base() {} };
struct A1 : Base {};
struct A2 : Base {};
struct myless {
bool operator()(const std::unique_ptr<Base>& lhs, const std::unique_ptr<Base>& rhs) const
{
return typeid(*lhs).before(typeid(*rhs));
}
};
std::set<std::unique_ptr<Base>, myless> myset;
myset.emplace(new A1()); // will insert
myset.emplace(new A1()); // will not insert
myset.emplace(new A2()); // will insert
myset.emplace(new A2()); // will not insert
。但是,像大多数C ++标准容器一样,它是同类型的容器,因此您只能存储单个类型。
如果要存储的所有类都是从一个公共基类派生的,那么您可能会考虑存储智能指针。例如:
std::set
接下来,由于myless
根据您可以定义的比较器强制每个值都是唯一的,因此您需要以比较每个实例的类型而不是值的方式来定义它。这就是<?php ?>
<div class="slicknav_menu"><div class="slicknav_brand"><a
href="https://twitter.com/pipdig" target="_blank" rel="nofollow noopener"><i
class="fa fa-twitter"></i></a><a href="https://instagram.com/pipdig"
target="_blank" rel="nofollow noopener"><i class="fa fa-instagram"></i></a><a
href="https://www.facebook.com/pipdig" target="_blank" rel="nofollow
noopener"><i class="fa fa-facebook"></i></a><a
href="https://www.pinterest.com/pipdig/" target="_blank" rel="nofollow
noopener"><i class="fa fa-pinterest"></i></a></div><a href="#" aria-
haspopup="true" role="button" tabindex="0" class="slicknav_btn
slicknav_collapsed"><span class="slicknav_menutxt"><i class="fa fa-bars"></i>
</span><span class="slicknav_icon"><span class="slicknav_icon-bar"></span>
<span class="slicknav_icon-bar"></span><span class="slicknav_icon-bar">
</span></span></a><ul role="menu" aria-hidden="true" style="display: none;"
class="slicknav_nav slicknav_hidden"><li class="menu-item menu-item-type-
post_type menu-item-object-page menu-item-128"><a tabindex="-1"
role="menuitem" href="../../about/index.html">About</a></li>
<?php
的作用。