Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从std::set或std::map继承初始化语法_C++_Stl - Fatal编程技术网

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
。实际上,为Python
dict
实现的任何操作都应该为
map
实现。Python
set
也是如此。问题不是使用频率,而是数据结构所代表的预期数学、直观和逻辑结构。
boolmap::contains(K key)
仅在非常狭窄的用例中有用。大多数情况下,您希望访问给定键的值。
vector::back()
也是如此。大多数情况下,您只想
向后推
、迭代或按索引访问。但这并没有阻止STL作者指定
back
。实际上,为Python
dict
实现的任何操作都应该为
map
实现。Python
set
也是如此。问题不是使用频率,而是数据结构所代表的预期数学、直观和逻辑结构。您可能应该在问题中添加非常具体的要求。基本上,您需要一些支持C++11减去继承构造函数的东西。是的,看起来只要使用GCC4.8就可以解决这些问题。然后