在C ++中迭代不同大小的向量的映射

时间:2015-12-17 21:46:44

标签: c++ dictionary vector

所以我用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。

3 个答案:

答案 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)

由于多种原因,您应该使用迭代器。

  1. 您的地图可能不包含从0到drawingPoints.size()的每个元素,并且对于您在循环时不包含的每个元素,您将创建它。
  2. 您的最高参赛作品可能会比drawingPoints.size()更高,在这种情况下您永远无法参加。
  3. 让我们看看最外层的循环,如果你想为它定义一个迭代器,你应该做以下事情:

    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使用迭代器遍历地图。