如何填充和编辑 std::array 个地图

How to populate and edit a std::array of maps

我有一组地图:

std::array<std::map<double, double>, 8> freqMap;

填充时,我需要在地图的不同数组索引处添加条目。我知道我可以创建 8 个不同的地图,填充它们,然后将它们添加到数组中,但是是否可以直接在数组中将条目附加到地图中?

例如,我将如何将 key 5.0、val 3.3 的映射条目添加到数组索引 2,然后将另一个条目添加到数组索引 3,然后再追加另一个条目再次进入索引 2,依此类推。

我也可以使用 std::vector 的地图,但仍然没有找到以这种方式添加条目的方法。

这是一个例子。我正在从文件中读取数据并想直接更新我的数据结构:

while (fin >> arrayIdx >> key>> val)
    freqMaps[arrayIdx] = ??

你可以简单地做:

while (fin >> arrayIdx >> key>> val)
  freqMaps[arrayIdx][key] = val;

For example, how would I go about adding a map entries of key 5.0, val 3.3 to array index 2

freqMaps[2][5.0] = 3.3;

这里是 demo

此外,请注意使用 double 作为 std::map 中的键不是一个好主意。

您可以使用花括号初始化列表:

while (fin >> arrayIdx >> key >> val)
    freqMap.at(arrayIdx) = {{key, val}};

while (fin >> arrayIdx >> key >> val)
    freqMap[arrayIdx] = {{key, val}};

当然前提是arrayIdx小于8,否则就是越界访问数组,我更倾向于使用at的第一种方法,因为万一访问不好,一个抛出异常,这为您提供了更好的错误处理选项。

要访问给定键的特定值,假设您要打印它:

std::cout << freqMap.at(arrayIdx).at(key);

或者循环遍历整个数组:

for (auto& a : freqMap)
{
    for (auto& m : a)
    {
        std::cout << m.first << m.second;
    }
}

Live sample

如果您使用 C++17 或更高版本, 中提供的循环方法比使用 firstsecond 节点更好。