将集合插入/读取到地图中

Insert/read a set into a map

本文关键字:地图 读取 集合 插入      更新时间:2023-10-16

我想使用 map<string, set<string>> 来"管理"航班。string键表示航班号,而set<string>值表示在航班上注册的人员姓名。就我而言,我从一个简单的文本文件中读取数据,例如:

123 jhonny
132 harry
123 bill
145 herry
132 jarry

为了找到同一航班上的人。

我知道插入地图的基本方法是

map<string, string> m;
m["hi"] = test;

并使用迭代器读取容器。

但是,如何将集合的组成插入并读取到地图中呢?

我尝试使用双迭代器,或使用while和迭代器从文件中获取数据:

string pers, volo;
while (wf >> volo >> pers) {
    m[volo] = pers;
}

但它给出了错误。

我是STL的新手,我已经阅读了一些文件,指南和其他文件来学习集合和映射,但我没有找到任何关于容器组合的信息(例如我描述的那个)。我该怎么做?也许在地图上和片场都有双重迭代器?

谢谢。

就像对待

任何类型的常规集合一样对待您的m[volo]。一旦您使用 std::map::operator[] 访问其值,您的set将被默认构造。这允许您直接使用 set 的任何成员函数。要向集合中添加值,请使用 std::set::insert

以下是使用标准输入/输出的代码可能的外观:

string a, b;
while (cin >> a >> b) {
    m[a].insert(b);
    cout << m[a].size() << endl;
}

如果要输出集合,一种方便的方法是定义operator<<的重载。下面定义模板的任何集。

template<typename T>
std::ostream& operator<<(std::ostream& os, const std::set<T>& s)
{
    for (auto& el : s)
        os << el << ' ';
    return os;
}

这允许您执行以下操作而不会出现任何错误。

for (auto it = m.begin(); it != m.end(); ++it)
{
    cout << it->first;   // a string
    cout << ' ';
    cout << it->second;   // a set
    cout << endl;
}