Как заполнить и отредактировать std::массив карт

У меня есть массив карт:

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] = ??

person SSB    schedule 28.08.2020    source источник
comment
Массивы имеют фиксированный размер. Если вы хотите добавить к нему, вы должны вместо этого использовать std::vector. Чтобы добавить записи, просто push_back.   -  person tadman    schedule 29.08.2020
comment
Пока это не const, вы можете без проблем добавлять внутренние карты.   -  person tadman    schedule 29.08.2020


Ответы (2)


Вы можете просто сделать:

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

Например, как мне добавить записи карты ключа 5.0, val 3.3 в индекс массива 2

freqMaps[2][5.0] = 3.3;

Вот демонстрация.

Также обратите внимание, что использование double в качестве ключей в std::map не является хорошей идеей.

person cigien    schedule 28.08.2020

Вы можете использовать список инициализации в фигурных скобках:

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

Or

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, лучше, чем использование узлов first и second.

person anastaciu    schedule 28.08.2020