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

C++ C+中不同大小向量的迭代映射+;,c++,dictionary,vector,C++,Dictionary,Vector,因此,我用C++声明了以下映射: typedef vector<Vector2D> stackPoints; typedef map<int, stackPoints> mapPoints; mapPoints drawingPoints; typedef向量堆栈点; typedef映射点; 地图点绘制点; 向其添加值后,我希望输出其中的所有元素,但不同关键位置的向量大小不同: 我将以下两个用于不起作用的循环。有时程序在运行时崩溃,并给出超出范围的向量错误 for

因此,我用C++声明了以下映射:

typedef vector<Vector2D> stackPoints; 
typedef map<int, stackPoints> mapPoints; 
mapPoints drawingPoints;
typedef向量堆栈点;
typedef映射点;
地图点绘制点;
向其添加值后,我希望输出其中的所有元素,但不同关键位置的向量大小不同:

我将以下两个用于不起作用的循环。有时程序在运行时崩溃,并给出超出范围的向量错误

for (int j = 0; j < drawingPoints.size(); j++)
{
    for (int i = 0; i < drawingPoints[j].size(); i++)
    {
        cout << "(...)" << endl
    }
}
for(int j=0;jcout问题在于迭代地图:您可以绘制点[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;
}
for(自动和kvp:绘图点){

cout问题在于迭代地图:您可以绘制点[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;
}
for(自动和kvp:绘图点){
cout
for(int j=0;jfor(int j=0;jcout出于多种原因,您应该使用迭代器

  • 您的映射可能不包含从0到
    drawingPoints.size()
    的所有元素,对于它不包含的每个元素,当您在其上循环时,您将创建它
  • 您的最高输入可能大于
    drawingPoints.size()
    ,在这种情况下,您将永远无法达到它
  • 让我们看一下最外层的循环,如果要为其定义迭代器,应执行以下操作:

    for (mapPoints::Iterator it = drawingPoints.begin(); it != drawingPoints.end(); it++) {
    
    这将创建一个迭代器,您可以查看它(通过执行
    it->
    *it


    可以找到更多信息。

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

  • 您的映射可能不包含从0到
    drawingPoints.size()
    的所有元素,对于它不包含的每个元素,当您在其上循环时,您将创建它
  • 您的最高输入可能大于
    drawingPoints.size()
    ,在这种情况下,您将永远无法达到它
  • 让我们看一下最外层的循环,如果要为其定义迭代器,应执行以下操作:

    for (mapPoints::Iterator it = drawingPoints.begin(); it != drawingPoints.end(); it++) {
    
    这将创建一个迭代器,您可以查看它(通过执行
    it->
    *it


    可以找到更多信息。

    drawingPoints[j]
    获取带有键
    j
    的条目,而不是
    j
    -第个条目!是的,这就是我想要的,不是吗?取决于drawingPoints[j]处向量的大小-这会改变!-我希望内部for循环同样频繁地执行。对于您的编辑,如果int只是一个指示条目数的索引,为什么不直接使用
    std::vector
    。那么您可以完全按照您所做的来做。是的,您完全正确,我的坏^
    绘图点[j]
    获取键为
    j
    的条目,而不是
    j
    的第个条目!是的,这就是我想要的,不是吗?取决于绘图点处向量的大小[j]-这会改变!-我希望内部for循环同样频繁地执行。对于您的编辑,如果int只是一个指示条目数的索引,为什么不直接使用
    std::vector
    。那么您可以完全执行您所做的操作。是的,您完全正确,我的错误^^^我使用整数键作为计数器,因此我在编辑时将其递增1添加另一对。@huzzm确切地说,它会添加另一对,除非密钥恰好在那里,在这种情况下,您可以迭代其对应的向量。@huzzm是的,它会工作。但是,如果按顺序迭代时密钥始终在那里,那么您最好使用向量向量,因为向量通常更快,占用的内存更少而不是一个映射。我使用整数键作为计数器,所以当我添加另一对时,我会将它增加1。@huzzm确切地说,它会添加另一对,除非该键恰好在那里,在这种情况下,您可以迭代其对应的向量。@huzzm是的,它会工作。但是,如果在按顺序迭代时该键始终在那里,那么您最好使用wi这是一个向量向量,因为向量通常比地图更快,占用的内存更少。我本来想在使用地图时添加一个建议使用迭代器的答案,但你抢先了我!我本来想在使用地图时添加一个建议使用迭代器的答案,但你抢先了我!
    for (mapPoints::Iterator it = drawingPoints.begin(); it != drawingPoints.end(); it++) {