我有一个包含std :: set<>的嵌套地图STL,有没有办法在c ++中预定义set的最大大小?
以下是我的DS:
std::map<Key, std::map<classObj, std::set<classObj> > >
我可以定义std :: set的最大大小而不定义此DS声明中上面任何地图的大小吗?
答案 0 :(得分:1)
我可以定义std :: set
的最大大小
没有
要强制执行限制,您应考虑为此目的制作自己的数据类型。
例如(仅用于说明):
template<typename T, std::size_t N>
class CustomSet
{
...
};
然后使用您的特殊目的类型而不是std::set
std::map<Key, std::map<classObj, CustomSet<classObj, 10>>>
std::set
确实接受自定义分配器。您是否可以提供自己的分配器来实现您的目标超出我的范围。但是,我个人仍然会制作自定义数据类型。
答案 1 :(得分:0)
最佳解决方案是封装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);
}