我正在尝试使用迭代器将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中?
谢谢!
答案 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()
未找到y
,iy
是结束迭代器值,则第一个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()
返回的事情之一。