为什么 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());

您正在指定一个表达式。这是两个截然不同的东西。