为什么 sorted_vector_map 中的 [] 运算符?
Why the [] operator in sorted_vector_map?
我不明白运算符 [] 在 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;
}
代码来自以下link...
https://github.com/facebook/folly/blob/master/folly/sorted_vector_types.h#L1097
答案在头文件中。
考虑:
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>>
所以是的,该行是构造函数调用,用于初始化 std::pair
,因为这是该特定数据结构用作其值的内容。
mapped_type()
也是一个构造函数调用,没有参数。它类似于:
int i = int();
Container
是定义 sorted_vector_map
使用什么容器来存储键值对的模板参数,默认为 std::vector
(std::vector<std::pair<Key, Value>, Allocator>>
)
value_type
是 Container::value_type
(typedef typename Container::value_type value_type;
),其中(对于默认模板参数)是 std::pair<Key, Value>
(参见 std::vector Member types)
mapped_type
是 Value
(typedef Value mapped_type;
) 所以存储在 sorted_vector_map
中的值的类型
What is value_type(key, mapped_type())?
What is mapped_type()?
Is it also a constructor call?
所以value_type(key, mapped_type())
创建一个std::pair
,key
作为first
,默认构造Value
(mapped_type()
)作为second
.
Is it a constructor call to std::pair by default?
是
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;
我不明白运算符 [] 在 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;
}
代码来自以下link...
https://github.com/facebook/folly/blob/master/folly/sorted_vector_types.h#L1097
答案在头文件中。
考虑:
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>>
所以是的,该行是构造函数调用,用于初始化 std::pair
,因为这是该特定数据结构用作其值的内容。
mapped_type()
也是一个构造函数调用,没有参数。它类似于:
int i = int();
Container
是定义 sorted_vector_map
使用什么容器来存储键值对的模板参数,默认为 std::vector
(std::vector<std::pair<Key, Value>, Allocator>>
)
value_type
是 Container::value_type
(typedef typename Container::value_type value_type;
),其中(对于默认模板参数)是 std::pair<Key, Value>
(参见 std::vector Member types)
mapped_type
是 Value
(typedef Value mapped_type;
) 所以存储在 sorted_vector_map
What is value_type(key, mapped_type())?
What is mapped_type()?
Is it also a constructor call?
所以value_type(key, mapped_type())
创建一个std::pair
,key
作为first
,默认构造Value
(mapped_type()
)作为second
.
Is it a constructor call to std::pair by default?
是
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;