Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.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++ 什么';这是获取Python';C++;?_C++_Python - Fatal编程技术网

C++ 什么';这是获取Python';C++;?

C++ 什么';这是获取Python';C++;?,c++,python,C++,Python,在Python中,有一个名为defaultdict的类,它本质上是一个字典,它将根据用户在构造时指定的函数按需构造元素 是否在C++中已经存在类似的类,或者我必须通过继承< map < /C> >并在方法中覆盖?< /p> 标准库中没有什么可以做到你想要的,你必须自己提供这样的类。 但是,请注意,公开继承标准库容器(例如std::map)是个坏主意;它们不是为此而设计的,它们没有虚拟函数,也没有虚拟析构函数。考虑这个例子,看看为什么这是个坏主意: template <class K, c

在Python中,有一个名为
defaultdict
的类,它本质上是一个字典,它将根据用户在构造时指定的函数按需构造元素


是否在C++中已经存在类似的类,或者我必须通过继承< <代码> map < /C> >并在方法中覆盖<代码>?< /p> 标准库中没有什么可以做到你想要的,你必须自己提供这样的类。 但是,请注意,公开继承标准库容器(例如

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
}

这不是对您问题的直接回答,但如果您希望聚合的行为与
defaultdict
相同,您可以使用
map.emplace
在键不存在时指定默认值,并向新项或现有项返回迭代器(避免第二次查找):

unordered_-map={{1,1},{2,3};
//后来。。。
对于(int i=1;i<4;i++){
自动定位对=地图定位(i,0);
第一个->第二个+=1;
}

看到这一点,我认为最好的方法是创建一个包装
std::map
(或
std::unordered_map
)的类。另请参见是否需要特定函数来创建元素,或者是否可以使用默认构造值(例如0)。在这种情况下,[]操作符已经完成了。我需要一个特定的函数。您不应该使用继承。只需编写一个为您完成工作的函数,或者编写一个具有映射而不是is映射的类。
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, Value, Comparator, Allocator>::clear;

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

  // Etc.
};
unordered_map<int, size_t> map = {{1, 1}, {2, 3}};
// later...
for (int i = 1; i < 4; i++) {
    auto emplace_pair = map.emplace(i, 0);
    emplace_pair.first->second += 1;
}