c создание карты (с векторами) из текстового файла

#c

Вопрос:

У меня есть текстовый файл, содержащий список имен переменных:

 name1
name2
name3
...
 

Я хочу прочитать это и создать карту, где ключи являются строками этих имен, а значения-векторами поплавков с этими именами. Моя цель состоит в том, чтобы иметь возможность просматривать карту и выполнять операции с векторами оптом, например, очищать их все.

Я могу легко прочитать имена в виде строк и добавить их в массив или вектор, но не знаю, как создавать векторы со списком имен.

Комментарии:

1. Пожалуйста, уточните. Я понимаю name1 , что name2 , name3 и т. Д. Являются ключами для карты, но откуда берутся поплавки, о которых идет речь?

2. Я надеялся пока оставить векторы пустыми, а поплавки вставить позже. Я хочу объявить/инициализировать большое количество векторов, не вводя их построчно

Ответ №1:

Взгляните на std::map или ( std::unordered_map ), например:

 #include <map>
#include <fstream>
#include <string>
#include <vector>

std::map<std::string, std::vector<float>> mymap;

std::ifstream in("names.txt");
std::string name;

while (std::getline(in, name))
{
    if (mymap.find(name) == mymap.end())
        mymap.insert(std::make_pair(name, std::vector<float>()));

    // or simply let operator[] construct the pair if it doesn't already exist:
    // mymap[name];
}
 

Затем вы можете делать такие вещи, как это:

 mymap["somename"].push_back(someValue);
 
 for(auto amp;elem : mymap)
{
    // do something with elem.first (name) and elem.second (vector) as needed...
    elem.second.clear();
}
 

Ответ №2:

Что — то вроде этого должно сработать:

 #include <fstream>
#include <map>
#include <vector>
#include <string>

std::map<std::string, std::vector<float>> names;
std::ifstream file(FILENAME);
if (file.is_open()) {
    std::string line;
    while (std::getline(file, line))
      names[line];
}
...
names["name1"].emplace_back(4.0f);
...
for(const auto amp;name:names) {
    cout << name.first;
    for(const auto amp;value:name.second)
        cout << value << endl;
    name.second.clear();
}
 

Или используйте unordered_map то, что может быть быстрее (использует хэш-таблицу вместо BST), если вам не нужно сортировать ваши элементы.

Комментарии:

1. Если мы используем функции C 17, пожалуйста, обратите внимание, что for (const auto amp;name:names) { ... } это может привести к деструктуризации и стать чем-то вроде: for (const auto amp; [name, vec] : names) { ... } .