0

我不明白运算符 [] 在 sorted_vector_map 中的作用。

  • 具体当key不存在时,给数据结构增加什么值?
  • 是什么value_type(key, mapped_type())
  • std::pair它是默认的构造函数调用吗?
  • 是什么mapped_type()
  • 它也是构造函数调用吗?
mapped_type& operator[](const key_type& key) {
    iterator it = lower_bound(key);
    if (it == end() || key_comp()(key, it->first)) {
      return insert(it, value_type(key, mapped_type()))->second;
    }
    return it->second;
}

代码来自以下链接...

https://github.com/facebook/folly/blob/master/folly/sorted_vector_types.h#L1097

4

2 回答 2

2

答案在头文件中。

考虑:

value_type(key, mapped_type())

您链接的文件的第 743 行,您将看到以下声明:

typedef typename Container::value_type value_type;

但是是什么Container?在第 728 行,您会发现 Container 是一个模板参数,它可能是一个std::pair(除非用户提供了另一个)。

class Container = std::vector<std::pair<Key, Value>, Allocator>>

所以是的,那行是一个构造函数调用来初始化 a std::pair,因为这就是这个特定的数据结构用作它的值。

mapped_type()也是一个构造函数调用,没有参数。它类似于:

int i = int();

于 2020-12-27T19:59:33.123 回答
1

Container是模板参数,它定义了用于sorted_vector_map存储键值对的容器,默认为std::vector( std::vector<std::pair<Key, Value>, Allocator>>)

value_typeis Container::value_type( typedef typename Container::value_type value_type;) which (对于默认模板参数) is std::pair<Key, Value>(见std::vector 成员类型)

mapped_typeValue( typedef Value mapped_type;) 所以存储在sorted_vector_map

什么是 value_type(key, mapped_type())?
什么是映射类型()?
它也是构造函数调用吗?

因此value_type(key, mapped_type())创建了一个std::pairwith keyasfirst和一个默认构造的Value( mapped_type()) as second

默认情况下它是对 std::pair 的构造函数调用吗?

是的

template <
    class Key,
    class Value, // <<===============
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<Key, Value>>,
    class GrowthPolicy = void,
    class Container = std::vector<std::pair<Key, Value>, Allocator>>   // <<===============
class sorted_vector_map : detail::growth_policy_wrapper<GrowthPolicy> {
  detail::growth_policy_wrapper<GrowthPolicy>& get_growth_policy() {
    return *this;
  }

  template <typename K, typename V, typename C = Compare>
  using if_is_transparent =
      _t<detail::sorted_vector_enable_if_is_transparent<void, C, K, V>>;

  struct EBO;

 public:
  typedef Key key_type;
  typedef Value mapped_type; // <<===============
  typedef typename Container::value_type value_type; // <<===============
  typedef Compare key_compare;
  typedef Allocator allocator_type;
  typedef Container container_type;
于 2020-12-27T20:17:56.003 回答