问题描述
我有一组地图:
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;
例如,如何将键5.0(值3.3)的映射项添加到数组索引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;
}
}
如果使用C ++ 17或更高版本,则@cigien's demo中提供的循环方法比使用first
和second
节点更好。