如何使用控制台创建std :: map并将其保存?

时间:2018-11-17 19:53:59

标签: c++ dictionary tuples stdmap

我希望能够通过使用控制台并获取用户输入来创建和存储值来创建和存储这些值。因此,我希望能够在控制台中输入

之类的内容
1234

123

1

它会使用诸如

这样的元组将其保存到我的地图中

std::map<int, std::tuple<int, int>> info; 

info[1234] = { 123, 1 };

对此我完全陌生,已经花了几个小时的时间来寻找东西,但是我不知道如何使用<< >>到我想使用它们的地方。我希望能够关闭该程序并将其打开,并且值仍将被存储。

任何和所有信息将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

我整理了一些示例代码来近似您的任务。它从标准输入读取一些整数,然后将其返回标准输出。为了您的目的,您可能希望以其他方式设置输出格式,并在某些时候将其从文件中读取/保存到文件中。可能有更简洁,更健壮,更高效和更漂亮的方法来进行此操作,但是我将它们快速组合起来以帮助您入门。如果您发现对您来说很奇怪的事情,我很乐意回答一些问题,但是此站点的想法是,您证明自己已经花了很多功夫来首先找到答案(例如,通过访问其他问题,阅读一些问题)。书籍,或在https://en.cppreference.com/w/cpp处查阅C ++参考文献

#include <iostream>
#include <map>
#include <stdexcept>

using namespace std;
using MyMap = map<int, pair<int, int>>;

MyMap::value_type read_entry() {
  int key, v_1, v_2;
  bool started_read{false};
  if ((cin >> key) && (started_read = true) && (cin >> v_1) && (cin >> v_2)) {
    return {key, {v_1, v_2}};
  } else if (started_read) {
    throw invalid_argument("improper input");
  } else {
    return {};
  }
}

MyMap read_map() {
  MyMap myMap;
  while (true) {
    auto entry = read_entry();
    if (cin) {
      myMap.insert(move(entry));
    } else if (cin.eof()) {
      return myMap;
    } else {
      throw invalid_argument("io error");
    }
  }
}

void dump_map(const MyMap &myMap) {
  for (auto &&value : myMap) {
    cout << value.first << "\n"
         << value.second.first << "\n"
         << value.second.second << endl;
  }
}

int main() {
  cout << "reading map..." << endl;
  MyMap myMap;
  try {
    myMap = read_map();
  } catch (invalid_argument e) {
    cout << "error encountered reading map: " << e.what() << endl;
    return 1;
  }

  cout << "dumping map..." << endl;
  dump_map(myMap);
}