使用迭代器将值插入嵌套映射

时间:2017-02-16 02:36:25

标签: c++

我正在尝试使用迭代器将Xmap插入到Ymap中。

typedef map<float, int> Xmap;
typedef map<float, Xmap> Ymap;

Xmap Xcoordinate;
Ymap Ycoordinate;

int Id;
float x;
float y;
char c;

    while (line >> Id >> c >> x >> c >> y)
    {
        Ymap::iterator iy = Ycoordinate.find(y);
        if (iy == Ycoordinate.end())
            Ycoordinate.insert(pair<float, Xmap>(y, Xmap()));
        iy->second.insert(pair<float, int>(x, Id));
    }  

我有来自文本文件的Id,x,y。 c是否可以处理逗号。

如何使用迭代器将x和Id插入到嵌套的Xmap中?

谢谢!

1 个答案:

答案 0 :(得分:0)

    Ymap::iterator iy = Ycoordinate.find(y);
    if (iy == Ycoordinate.end())
        Ycoordinate.insert(pair<float, Xmap>(y, Xmap()));
    iy->second.insert(pair<float, int>(x, Id));

如果find()未找到yiy是结束迭代器值,则第一个insert()会在第一个地图中插入新条目。

这很好,花花公子,但由于新值插入到地图中,这不会自动更改iy以引用新插入的值。因此,iy仍为end(),就像确定的if语句一样,iy->second最终取消引用结束迭代器值,从而导致未定义的行为。

解决此问题的一种方法是简单地设置iy

    if (iy == Ycoordinate.end())
        iy=Ycoordinate.insert(pair<float, Xmap>(y, Xmap())).first;

有关详细信息,请参阅地图insert()方法的文档,特别是返回值。

但所有这一切似乎都是完全没必要的,还有一堆额外的工作。根据它的外观,这里发生的所有事情是,如果密钥不存在,则将默认初始化值插入到地图中。

为什么重新发明轮子?这就是operator[]的用途:

while (line >> Id >> c >> x >> c >> y)
{
    Ycoordinate[y].insert(pair<float, int>(x, Id));
}

或者,甚至:

while (line >> Id >> c >> x >> c >> y)
{
    Ycoordinate[y][x]=Id;
}

这显然要简单得多。但是,如果你想学习如何“使用迭代器将值插入到地图中”,从逻辑上讲,你需要阅读std::map::insert的文档,它会告诉你它究竟是如何工作的。如果你这样做,你应该立即明白你仍然可以简化你的逻辑:

while (line >> Id >> c >> x >> c >> y)
{
    Ycoordinate.insert(pair<float, Xmap>(y, Xmap())).first
       ->second.insert(pair<float, int>(x, Id));
}

从技术上讲,这仍然是使用迭代器,因为这是insert()返回的事情之一。