Прежде всего, нет смысла утверждать, что Xcode не отображал никаких сообщений об ошибках для вашего кода. Попробуйте либо включить все предупреждения компилятора, либо попробовать онлайн-компиляторы. Результат не разочарует: https://godbolt.org/z/cU54GX
Если я правильно понял, вы хотите сохранить вашу информацию из двух файлов (целочисленных значений) в std::map
, где его ключ = std::string
и значение = vector of integer array
.
Если это так,
1 . У вас есть проблемы с чтением целых чисел из файлов.
Там вы используете double
без причины и сохраняете
std::vector<int>
(i, e print1
и print2
).
2 . Во-вторых, что если ваш файл не был открыт? inputFile.close();
и inputFile2.close();
все равно закроет его, не зная
факт. Это не верно.
Правильный путь будет:
inputFile.open("numbers.txt", std::ios::in); // opening mode
if (inputFile.is_open()) {
// do stuff
inputFile.close(); // you need closing only when file has been opened
}
3 . Если вы собираетесь печатать только keys
и values
, вы не
нужно разобрать их по разным векторам.
Вы можете сделать это напрямую:
for(const std::pair<kType, vType>& mapEntry: contacts)
{
std::cout << "Key: " << mapEntry.first << " Values: ";
for(const int values: mapEntry.second) std::cout << values << " ";
std::cout << std::endl;
}
В c ++ 17 вы можете использовать Структурированное связывание
for(const auto& [Key, Values]: contacts)
{
std::cout << "Key: " << Key << " Values: ";
for(const int value: Values) std::cout << value << " ";
std::cout << std::endl;
}
4 . Если вы действительно хотите разобрать их в другом векторе; Прежде всего, структура данных для хранения keys
неверна:
std::vector<int> values(contacts.size());
^^^^^^
который должен был быть вектором целых чисел, как ваш vType = std::vector<int>
. То есть
std::vector<std::vector<int>> values
^^^^^^^^^^^^^^^^^^
Во-вторых, у вас неправильные функции key(const std::pair<std::string, std::string>& keyValue)
и value(const std::pair<std::string, std::string>& keyValue)
, когда вы передаете пару строк в качестве ключей и значений.
Это должно было быть
typedef std::string kType; // type of your map's key
typedef std::vector<int> vType;// value of your map's value
std::pair<kType, vType>
Однако вы можете просто заменить их лямбдами, которые были бы более интуитивными в смысле наличия функций рядом со строкой, в которой вы нуждались. Например,
std::vector<kType> keysVec;
keysVec.reserve(contacts.size());
auto getOnlyKeys = [](const std::pair<kType, vType>& mapEntry){ return mapEntry.first; };
std::transform(contacts.begin(), contacts.end(), std::back_inserter(keysVec), getOnlyKeys);
См. Пример кода здесь