【问题标题】:What does this map initialization mean in C++ STL?这个映射初始化在 C++ STL 中是什么意思?
【发布时间】:2021-08-16 07:33:29
【问题描述】:
int numSubarraysWithSum(vector<int>& A, int S) {
    unordered_map<int, int> c({{0, 1}});// Line 1
    int psum = 0, res = 0;
    for (int i : A) {
        psum += i;
        res += c[psum - S];
        c[psum]++;
    }
    return res;
}

第 1 行是什么意思?我很困惑,因为有两个花括号。

【问题讨论】:

  • given answer 中提到的初始化程序列表。外大括号定义初始化列表本身,内大括号是构造std::pairs的简写,在映射中用于存储键和对应的值。
  • 您可能会看到相同的构造省略了(圆)括号,这是合法的(统一初始化 - 也适用于内部对),但我一般不推荐这样做(尤其是不在模板中),因为在某些情况下可以选择错误的构造函数,例如。 G。 std::vector&lt;int&gt; v{7, 3} 使用初始化列表构造函数,但您可能想要选择 third variant of。如果稍后添加初始化列表构造函数,这对于开发中的类尤其重要。
  • 所以我个人的建议是更喜欢经典的构造函数调用(你已经看到的圆括号)而不是统一初始化:std::vector v(7, 3)(三个七)与std::vector v({7, 3})(一个七,一三) 更加清晰。

标签: c++ dictionary stl unordered-map


【解决方案1】:

它被称为Initilizer list。根据this website

Initializer List 用于初始化类的数据成员。 要初始化的成员列表用构造函数表示为 一个逗号分隔的列表,后跟一个冒号。

基本上,它会在您创建它时将元素添加到您的std::map(或者在本例中为您的std::unordered_map)。

更具体地说,来自上面的@Aconcagua 评论:

外大括号定义 initializer list 本身,内部大括号是 构造std::pairs,在std::map中用于存储密钥 和相应的值。

您可以从这段代码中看到这一点:

#include <iostream>
#include <map>
#include <unordered_map>
using namespace std;

int main()
{
    map<int, int> c({{0, 1}, {1, 7}});
    for (auto it = c.begin(); it!=c.end(); it++)
    {
        cout << it->first << " " << it->second << "\n";
    }
}

输出:

0 1
1 7

还有其他支持这一点的数据类型,例如std::vector

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> test({0, 7, 9, 11, 3});
    for (auto x : test) {cout << x << "\n";}
}

输出:

0
7
9
11
3

关于这个有很多问题:

更多信息:https://en.cppreference.com/w/cpp/utility/initializer_list

*注意事项:正如下面提到的@Aconcagua,using namespace std is not considered a good practice,虽然它可能会节省一些打字时间。

【讨论】:

  • 考虑到这一切都发生在构造函数中,我将right after you created it替换为right while creating it。即使显然问题作者这样做了,我也不会在我自己对good reasons 的答案中应用using namespace std。除此之外,很好的答案。
  • @Aconcagua 感谢您的评论,我将修改我的答案并添加using namespace std; 注意事项。
【解决方案2】:

它只是简单地将元素添加到您的地图中。有许多不同的方法可以做到这一点:

  1. unordered_map&lt;int, int&gt; c{ {0, 1} }; 与您的问题类似

2 unordered_map&lt;int, int&gt; c;
c[0]=1;
分配键和值

3.

 unordered_map<int, int> c;
       c.insert(std:: make_pair (key, vale) );  use make_pair

...你可以在这里参考更多map

【讨论】:

  • 在 1. 和 2./3. 之间有区别:第一个变体直接初始化地图,立即分配足够的内存,而其他两个变体首先创建一个空的,默认初始化映射,然后才请求内存。这(稍微)效率较低。
  • 我不建议省略初始化列表周围的圆括号,请参阅我的 cmets 问题。不过,有些人可能会自相矛盾,所以请自己决定;)
猜你喜欢
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2010-12-09
  • 1970-01-01
相关资源
最近更新 更多