在C ++中设置数据结构,每个类仅包含一个外观

时间:2018-07-08 06:45:05

标签: c++ data-structures

我需要有一个只能包含每个类的一个实例的集合(或任何其他数据结构)。 例如: 我有一个接口A,并且有一个实现它的A1。

我有代码:

std::set<A> myset;
A1 a1;
A1 a11;
myset.insert(a1); // should insert
myset.insert(a11);// should not insert

我希望a11不在集合中。 我本来想用自定义比较器来做的,但是我不知道如何实现这个比较器。

有什么想法吗?

1 个答案:

答案 0 :(得分:6)

您似乎认为tuple是一个异类容器,例如pairstruct 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 的作用。