标准库忽略了实现std::set
和std::map
的基本操作,如
set<T> set<T>::getUnion(set<T> other)
和
bool map<K,V>::contains(K key)
我知道这些方法有冗长和/或间接的解决方法,但如果我希望我的代码具有最大的可读性和表现力,我将不得不继承STL,编写我自己的{{1} }和Set
类,并自己实现它们。是的,我知道反对这样做的讲道,但事实是STL不完整。
我已经这样做但现在我无法使用例如
来初始化我的新课程Map
如何从Set<int> s = {1,2,3,4};
类继承这些初始值设定项?
答案 0 :(得分: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);
}
答案 1 :(得分:1)
对于gcc 4.7.x
,您必须致电initializer_list
或set
的{{1}}构造函数:
map
允许
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
,我将选择它作为答案。