C++ 从std::set或std::map继承初始化语法
标准库忽略了实现C++ 从std::set或std::map继承初始化语法,c++,stl,C++,Stl,标准库忽略了实现std::set和std::map等的基本操作 set<T> set<T>::getUnion(set<T> other) 如何从std类继承这些初始值设定项?尽管从标准库容器公开继承被认为是个坏主意,但您可以“继承”构造函数: template <typename T> struct Set : std::set<T> { using std::set<T>::set; // "inherit" th
std::set
和std::map
等的基本操作
set<T> set<T>::getUnion(set<T> other)
如何从
std
类继承这些初始值设定项?尽管从标准库容器公开继承被认为是个坏主意,但您可以“继承”构造函数:
template <typename T>
struct Set : std::set<T>
{
using std::set<T>::set; // "inherit" the constructors.
};
模板
结构集:std::Set
{
使用std::set::set;//“继承”构造函数。
};
然后
集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);
}
模板
bool包含(常量C和容器,常量类型名C::key\u type和key)
{
返回容器。计数(键);
}
和。尽管公开继承标准库容器被认为是一个坏主意,但您可以“继承”构造函数:
template <typename T>
struct Set : std::set<T>
{
using std::set<T>::set; // "inherit" the constructors.
};
模板
结构集:std::Set
{
使用std::set::set;//“继承”构造函数。
};
然后
集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);
}
模板
bool包含(常量C和容器,常量类型名C::key\u type和key)
{
返回容器。计数(键);
}
和。对于
gcc 4.7.x
,您必须调用集合
或映射
的初始值设定项列表
构造函数:
template <typename T>
class Set : public set<T> {
public:
Set(){
set<T>::set();
}
Set(initializer_list<T> iList) {
set<T>::set(iList);
}
};
模板
类集合:公共集合{
公众:
集合(){
set::set();
}
集合(初始值设定项列表iList){
set::set(iList);
}
};
允许
Set<int> s = {1,2,3,4};
Set s={1,2,3,4};
但是经过多次尝试和错误,我找不到一种方法来为std::map
实现这一点
而且,它禁用了所有其他构造函数,需要我重新实现它们,这是一项我还没有完成的任务,所以我现在只是放弃初始化列表。欢迎任何人提交一个答案,将所有构造函数重新实现为
Set
,我将选择它作为答案。对于gcc 4.7.x
,您必须调用初始值设定项列表构造函数以获得Set
或map
:
template <typename T>
class Set : public set<T> {
public:
Set(){
set<T>::set();
}
Set(initializer_list<T> iList) {
set<T>::set(iList);
}
};
模板
类集合:公共集合{
公众:
集合(){
set::set();
}
集合(初始值设定项列表iList){
set::set(iList);
}
};
允许
Set<int> s = {1,2,3,4};
Set s={1,2,3,4};
但是经过多次尝试和错误,我找不到一种方法来为std::map
实现这一点
而且,它禁用了所有其他构造函数,需要我重新实现它们,这是一项我还没有完成的任务,所以我现在只是放弃初始化列表。欢迎任何人提交一个答案,将所有构造函数重新实现为Set
,我将选择它作为答案。为什么不将contains
generic用于8个容器:template bool contains(const C&C,const typename C::key_type&k){返回C.count(k);}
?不鼓励从标准容器继承,因为可能会发生切片或不正确的销毁,如果您没有任何添加的数据成员或虚拟函数,并且您的派生析构函数是默认值,则这不会成为问题。当然,这意味着您希望在您了解这些规则之后出现的维护人员也知道这些规则。@Markransem同意,但只要您不尝试通过基类指针删除,就不会有问题。但私有继承对我来说似乎相当安全代码>@ChrisRedford您需要C++11支持。看见如果没有C++11,您必须手工操作。为什么不将contains
作为8个容器的通用模板:template bool contains(const C&C,const typename C::key_type&k){return C.count(k);}
?不鼓励从标准容器继承,因为可能会进行切片或不正确的破坏,如果您没有任何添加的数据成员或虚拟函数,并且您的派生析构函数是默认的,那么这不会是一个问题。当然,这意味着您希望在您了解这些规则之后出现的维护人员也知道这些规则。@Markransem同意,但只要您不尝试通过基类指针删除,就不会有问题。但私有继承对我来说似乎相当安全代码>@ChrisRedford您需要C++11支持。看见如果没有C++11,您必须手工操作。boolmap::contains(K键)
仅在非常狭窄的用例中有用。大多数情况下,您希望访问给定键的值。vector::back()
也是如此。大多数情况下,您只想向后推
、迭代或按索引访问。但这并没有阻止STL作者指定back
。实际上,为Pythondict
实现的任何操作都应该为map
实现。Pythonset
也是如此。问题不是使用频率,而是数据结构所代表的预期数学、直观和逻辑结构。boolmap::contains(K key)
仅在非常狭窄的用例中有用。大多数情况下,您希望访问给定键的值。vector::back()
也是如此。大多数情况下,您只想向后推
、迭代或按索引访问。但这并没有阻止STL作者指定back
。实际上,为Pythondict
实现的任何操作都应该为map
实现。Pythonset
也是如此。问题不是使用频率,而是数据结构所代表的预期数学、直观和逻辑结构。您可能应该在问题中添加非常具体的要求。基本上,您需要一些支持C++11减去继承构造函数的东西。是的,看起来只要使用GCC4.8就可以解决这些问题。然后