所以我用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。
答案 0 :(得分:2)
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
}
}
答案 1 :(得分:2)
由于多种原因,您应该使用迭代器。
drawingPoints.size()
的每个元素,并且对于您在循环时不包含的每个元素,您将创建它。drawingPoints.size()
更高,在这种情况下您永远无法参加。让我们看看最外层的循环,如果你想为它定义一个迭代器,你应该做以下事情:
for (mapPoints::Iterator it = drawingPoints.begin(); it != drawingPoints.end(); it++) {
这会创建一个您可以查看的迭代器(通过执行it->
或*it
)。
可以找到更多信息here。
答案 2 :(得分:1)
问题在于迭代地图:您可以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。如果您使用较旧的编译器,请使用this Q&A使用迭代器遍历地图。