2014-05-02 45 views
0

标准库忽略实现基本操作为std::setstd::map继承初始化从语法的std ::设置或std ::地图

set<T> set<T>::getUnion(set<T> other) 

bool map<K,V>::contains(K key) 

我知道有冗长和/或这些方法的间接解决方法,但如果我希望我的代码具有最大的可读性和表达性,我将不得不从STL继承,编写我自己的SetMap类,并自己实现它们。是的,我知道这样做的说教,但事实是STL是不完整的。

我已经这样做了,但现在我可以使用,例如,未初始化我的新类,

Set<int> s = {1,2,3,4}; 

如何继承了std类这些初始化?

+0

'bool map :: contains(K key)'仅在非常狭窄的用例中有用。大多数情况下,您想要访问给定密钥的值。 –

+0

所以'vector :: back()'。大多数情况下,您只需要'push_back',迭代或按索引访问。但是这并没有阻止STL作者指定“back”。实际情况是,为'map'实现的任何为Python'dict'实现的操作都应该实现。 Python'set'也是一样。问题不在于使用频率,而在于数据结构所代表的数学,直观和逻辑结构。 –

回答

3

尽管公开的标准库中的容器继承的事实被认为是一个坏主意,你可以“继承”的构造函数:

template <typename T> 
struct Set : std::set<T> 
{ 
    using std::set<T>::set; // "inherit" the constructors. 
}; 

然后

Set<int> s{1,6,4,3,3,9}; 

需要注意的是一个更好的办法可能是为了实现功能:

template <typename C> 
bool contains(const C& container, const typename C::key_type& key) 
{ 
    return container.count(key); 
} 

and similarly for the union of sets

+1

为什么不为8个容器制作'contains' generic:'template bool contains(const C&c,const typename C :: key_type&k){return c.count(k); }'? –

+0

@DanielFrey好主意。我会编辑。 – juanchopanza

+0

由于存在切片或不正确销毁的潜力,不鼓励继承标准容器,如果您没有任何添加的数据成员或虚函数,并且派生的析构函数是默认的,则不会造成问题。当然,这意味着你希望在知道这些规则之后维护者也会来。 –

1

gcc 4.7.x,你必须调用initializer_list构造函数setmap

template <typename T> 
class Set : public set<T> { 
public: 
    Set(){ 
     set<T>::set(); 
    } 
    Set(initializer_list<T> iList) { 
     set<T>::set(iList); 
    } 
}; 

允许

Set<int> s = {1,2,3,4}; 

但大部分经过反复试验,我不能找到一种方法,为std::map做这个。

此外,它禁用所有其他构造函数,要求我重新实现它们,我还没有完成任务,所以我现在就放弃初始化列表。欢迎任何人提交一个答案,将所有构造函数重新实现为Set,我将选择它作为答案。

+0

您应该在问题中添加非常具体的要求。基本上,你需要一些支持C++ 11减去继承构造函数的东西。 – juanchopanza

+0

是的,它看起来就像使用gcc 4.8会解决这些问题。然后我可以使用你的答案,我已经验证了在另一台机器上使用更新的编译器。 –