簡體   English   中英

C ++中不同大小的向量的迭代圖

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

由於多種原因,您應該使用迭代器。

  1. 您的地圖可能不包含從0到drawingPoints.size()的每個元素,並且當您對其進行循環時,您將為其創建的不包含的每個元素。
  2. 您的最高條目可能大於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM