C ++ unordered_map初始化底层会发生什么

时间:2016-06-26 12:15:16

标签: c++

Inconsistance发生!

这段代码很顺利

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> num_freq_map;
        for(const auto &ele : nums) {
            ++num_freq_map[ele];
        }
    }
};

但当我从unordered_map<int, int> num_freq_map;更改为unordered_map<int, int> num_freq_map () ;时,会附加一对括号。

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> num_freq_map();
        for(const auto &ele : nums) {
            ++num_freq_map[ele];
        }
    }
};

我收到了一个错误: Line 6: lvalue required as increment operand

为什么呢?初始化时我的变量num_freq_map会发生什么?

我应该如何学习这类东西。阅读标准模板库源代码,对吗?

2 个答案:

答案 0 :(得分:1)

unordered_map<int, int> num_freq_map();

num_freq_map定义为指向不接受任何参数并返回unordered_map<int, int>的函数的指针。但不要担心,因为

unordered_map<int, int> num_freq_map;

已经为您调用了正确的默认构造函数。如果要对读者明确调用,在C ++ 11中可以使用大括号初始化:

unordered_map<int, int> num_freq_map{};

答案 1 :(得分:1)

unordered_map<int, int> num_freq_map();

解释如下:

num_freq_map是一个没有参数的函数,返回unordered_map<int, int>

要了解这类内容,请阅读Marshall Cline的C ++ FAQ。

没有“STL源代码”这样的东西。 STL有许多不同的实现。我还怀疑读取STL源代码是有用的,除非你有一些非常具体的问题。