C++ 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
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;j 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问题在于迭代地图:您可以绘制点[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:绘图点){
coutfor(int j=0;jfor(int j=0;j cout出于多种原因,您应该使用迭代器
您的映射可能不包含从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++) {