[英]Iterating map of vectors of different sizes in C++
因此,我在C ++中声明了以下映射:
typedef vector<Vector2D> stackPoints;
typedef map<int, stackPoints> mapPoints;
mapPoints drawingPoints;
向其添加值之后,我想输出其中的所有元素,但是不同键位置上的向量的大小不同:
我正在使用以下两个不起作用的for循环。 有时,程序在运行时崩溃,并给了我超出范围的矢量错误。
for (int j = 0; j < drawingPoints.size(); j++)
{
for (int i = 0; i < drawingPoints[j].size(); i++)
{
cout << "(...)" << endl
}
}
在我看来,内部for循环已经历了恒定的时间,好像不可能出现以下情况:
1)第一个向量的大小为1,因此内部for循环将执行一次。
2)然后,地图的第二个向量的大小为5,现在我希望for循环经过5次,但这似乎不起作用。
**编辑**
我使用整数键作为计数器,因此当我添加另一对时,我将其递增1。
for (int j = 0; j < drawingPoints.size(); j++)
{
// This is wrong.
// j is not necessarily a valid key in the map.
for (int i = 0; i < drawingPoints[j].size(); i++)
{
cout << "(...)" << endl
}
}
使用迭代器可以避免此类问题。
mapPoints::iterator map_begin = drawingPoints.begin();
mapPoints::iterator map_end = drawingPoints.end();
for ( ; map_begin != map_end; ++map_iter )
{
stackPoints::iterator v_iter = map_iter->second.begin();
stackPoints::iterator v_end = map_iter->second.end();
for ( ; v_iter != v_end; ++v_iter )
{
cout << "(...)" << endl
}
}
如果使用的是C ++ 11编译器,则可以使用:
for ( auto& map_item : mapPoints )
{
for ( auto& v_item : map_item.second )
{
cout << "(...)" << endl
}
}
由于多种原因,您应该使用迭代器。
drawingPoints.size()
的每个元素,并且当您对其进行循环时,您将为其创建的不包含的每个元素。 drawingPoints.size()
在这种情况下,您将永远无法达到它。 让我们看一下最外层的循环,如果要为其定义一个迭代器,则应执行以下操作:
for (mapPoints::Iterator it = drawingPoints.begin(); it != drawingPoints.end(); it++) {
这将创建一个您可以查看的迭代器(通过执行it->
或*it
)。
可以在此处找到更多信息。
问题是迭代地图:您可以执行drawingPoints[j]
完全是偶然的事实-地图键的类型恰好是int
,因此j
可以很好地用作索引。 但是,并非所有j
都将在映射中包含任何内容,因此该代码不起作用。
这是您遍历地图的方式:
for(auto& kvp : drawingPoints) {
cout << "Key " << kvp.first << " has the following values:" << endl;
for (auto n : kvp.second) {
cout << n << " ";
}
cout << endl;
}
上面的示例需要C ++ 11。 如果您使用的是较旧的编译器,请使用此问答,以使用迭代器遍历地图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.