[英]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.