为什么 for_each 要求将实例作为参数传递,而无序映射的哈希一元函数在 C++ 中不需要?
Why for_each requires an instance to be passed as an argument while the hash unary function for unordered map does not in C++?
用自定义哈希函数构建无序映射
struct EnumClassHash
{
template <typename T>
std::size_t operator()(T t) const
{
return static_cast<std::size_t>(t);
}
};
enum class MyEnum {};
std::unordered_map<MyEnum, int, EnumClassHash> myMap;
构造一个for_each
函数
struct Class
{
void operator() (int a)
{
cout << a * 3 << " ";
}
};
for_each(arr, arr + 5, Class());
// or equivalently
Class ob;
for_each(arr, arr + 5, ob);
为什么 for_each
需要传递一个实例,而无序映射的哈希器可以直接采用 class (EnumClassHash vs Class() / ob )?
std::unordered_map
实际上有一个重载的构造函数,如果你想提供一个,它将比较器的一个实例作为参数。否则 std::unordered_map
默认构造比较器。它可以做到这一点,因为它知道比较器 class 是什么,它就在模板中给出。
另一方面,如果 std::for_each
没有作为第三个参数显式传递,您认为 UnaryFunction
class instance 可能从哪里获得?假设你有这个例子:
std::for_each(container.begin(), container.end());
这个 std::for_each
怎么知道什么会吞噬序列?我想容器的 class 可以作为 std::for_each
的显式模板参数,但这不必要地使接口复杂化并且并没有真正增加太多价值。
写的时候
std::unordered_map<MyEnum, int, EnumClassHash>
您正在指定 类型。当你写
for_each(arr, arr + 5, Class());
您正在指定一个表达式。这是两个截然不同的东西。
用自定义哈希函数构建无序映射
struct EnumClassHash
{
template <typename T>
std::size_t operator()(T t) const
{
return static_cast<std::size_t>(t);
}
};
enum class MyEnum {};
std::unordered_map<MyEnum, int, EnumClassHash> myMap;
构造一个for_each
函数
struct Class
{
void operator() (int a)
{
cout << a * 3 << " ";
}
};
for_each(arr, arr + 5, Class());
// or equivalently
Class ob;
for_each(arr, arr + 5, ob);
为什么 for_each
需要传递一个实例,而无序映射的哈希器可以直接采用 class (EnumClassHash vs Class() / ob )?
std::unordered_map
实际上有一个重载的构造函数,如果你想提供一个,它将比较器的一个实例作为参数。否则 std::unordered_map
默认构造比较器。它可以做到这一点,因为它知道比较器 class 是什么,它就在模板中给出。
另一方面,如果 std::for_each
没有作为第三个参数显式传递,您认为 UnaryFunction
class instance 可能从哪里获得?假设你有这个例子:
std::for_each(container.begin(), container.end());
这个 std::for_each
怎么知道什么会吞噬序列?我想容器的 class 可以作为 std::for_each
的显式模板参数,但这不必要地使接口复杂化并且并没有真正增加太多价值。
写的时候
std::unordered_map<MyEnum, int, EnumClassHash>
您正在指定 类型。当你写
for_each(arr, arr + 5, Class());
您正在指定一个表达式。这是两个截然不同的东西。