我有一个包含 std::set<> STL 的嵌套映射,有没有办法在 c++ 中预定义集合的最大大小?
以下是我的 DS:
std::map<Key, std::map<classObj, std::set<classObj> > >
我可以定义 std::set 的最大大小而不定义此 DS 声明中上述任何映射的大小吗?
我有一个包含 std::set<> STL 的嵌套映射,有没有办法在 c++ 中预定义集合的最大大小?
以下是我的 DS:
std::map<Key, std::map<classObj, std::set<classObj> > >
我可以定义 std::set 的最大大小而不定义此 DS 声明中上述任何映射的大小吗?
我可以定义 std::set 的最大大小吗
不。
要强制执行限制,您应该考虑为此目的创建自己的数据类型。
例如(仅用于说明):
template<typename T, std::size_t N>
class CustomSet
{
...
};
然后使用您的特殊用途类型而不是std::set
std::map<Key, std::map<classObj, CustomSet<classObj, 10>>>
std::set
确实接受自定义分配器。您是否可以提供自己的分配器来实现您的目标,这超出了我的范围。但是,我个人仍然会制作自定义数据类型。
最好的解决方案是包装std::set
类并重新实现可以添加第 11 个元素的方法insert
:emplace
和emplace_hint
.
基本模式很简单:
template< typename Key,
typename Compare = std::less<Key>,
typename Allocator = std::allocator<Key>>
class restrictedSet : private std::set<Key, Compare, Allocator>
{
int maxElem;
public:
restrictedSet(int maxElem) : maxElem (maxElem) { }
using set::iterator;
using set::begin;
using set::end;
//etc
std::pair<iterator,bool> insert( value_type const& value )
{
if (size==maxElem) return std::make_pair(std::prev(end()), false);
return set::insert(value);
}