加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中获取Python的`defaultdict`行为最简单的方法是什么?

发布时间:2020-12-16 05:06:43 所属栏目:百科 来源:网络整理
导读:在 Python中,有一个名为defaultdict的类,它本质上是一个字典,它将根据用户在构造时指定的函数按需构造元素. C中是否存在类似的类,或者我是否必须通过继承map并覆盖at方法来自己创建它? 解决方法 标准库中没有任何内容能够完全满足您的需求,您必须自己提供这
在 Python中,有一个名为defaultdict的类,它本质上是一个字典,它将根据用户在构造时指定的函数按需构造元素.

C中是否存在类似的类,或者我是否必须通过继承map并覆盖at方法来自己创建它?

解决方法

标准库中没有任何内容能够完全满足您的需求,您必须自己提供这样的课程.

但请注意,从标准库容器(例如std :: map)公开继承是一个坏主意;它们不是为此设计的,它们没有虚函数,也没有虚拟析构函数.考虑这个例子,看看为什么这是一个坏主意:

template <class K,class V,class C,class A>
void foo(const std::map<K,V,C,A> &arg)
{
  doSomething(arg.at(K()));
}

struct MyMap : std::map<int,int>
{
  int at(int) { return 7; }
};

int main()
{
  MyMap m;
  foo(m);  //this will call std::map::at,NOT MyMap::at
}

相反,让你的类按值存储一个std :: map(或者std :: unordered_map,无论哪个更适合你的实现).或者,如果您认为可以重复使用许多标准映射的成员函数并仅覆盖某些函数,则可以非公开地继承它并仅发布所需的函数.例:

template <
  class Key,class Value,class Comparator = typename std::map<Key,Value>::key_compare,class Allocator = typename std::map<Key,Value>::allocator_type
>
class DefaultDict : private std::map<Key,Value,Comparator,Allocator>
{
public:
  // Publish the clear() function as is
  using std::map<Key,Allocator>::clear;

  // Provide my own at()
  Value& at(const Key &key) {
    return std::map<Key,Allocator>::operator[](key); //call the inherited function
  }

  // Etc.
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读