#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) { ... }
.