簡體   English   中英

std :: map :: size()與迭代器不同

[英]std::map::size() differs from iterators

我使用帶有自定義比較類和自定義類作為鍵的std :: map

現在,我使用operator []通過鍵訪問元素。 但是,這似乎造成了一個大問題。 映射似乎錯誤地分配了元素,否則它們將損壞。 這很明顯,因為我的自定義比較類在檢測到它比較的一個對象在其數據字段中存儲了任意值時拋出異常(這似乎暗示構造函數未運行或從未在對象中創建該對象)。第一名)

現在出現另一個差異:

當我調用std :: map :: size()並將其與我可以增加begin()迭代器到end()迭代器的次數進行比較時,它們不匹配。

具體來說,地圖報告的size()大於其明顯包含的size()。

我用作鍵的類是帶有數據字段的自定義矩陣類:

unsigned int
unsigned int
vector<vector<Another Class>>

但是,在這些類中,沒有一個使用指針算術或其他可以直接操作內存的方法。 另外,我在使用的任何類中都沒有自定義定義的副本構造函數。

編輯:比較功能

struct SymModMatComp
{
  bool operator()(const ModMat& mat1, const ModMat& mat2) const
  {
    unsigned int rows = mat1.get_row_number();

    unsigned int columns = mat1.get_column_number();
    if(mat2.get_row_number() != rows || mat2.get_column_number() != columns)
    {
      throw dimension_mismatch();
    }
    for(unsigned int i = 0; i < rows; i++)
    {
      for(unsigned int j = 0; j < columns; j++)
      {
        if(mat1.get_item(i,j).get_value() < mat2.get_item(i,j).get_value())
        {
          return true;
        }
        else if(mat1.get_item(i,j).get_value() > mat2.get_item(i,j).get_value())
        {
          return false;
        }
      }
    }
    return false;
  }
}

get_value()返回一個無符號的int

解決了:

我用valgrind檢查是否有任何內存訪問錯誤...我發現程序reallz的一個完全不相關的部分確實在一遍又一遍地對已經刪除的對象進行了刪除。

這似乎已損壞了地圖存儲項目的空間。

謝謝所有的好主意!

沒有代碼,很難猜測,但是我還是會嘗試。

您是否知道T&operator [](const key_type&x) ; 如果鍵不存在,將值插入地圖嗎? 因此,如果您還沒有地圖中的鍵,則地圖大小將增加一。

元素將使用默認構造函數創建。

如果您在使用帶有復雜的用戶定義鍵的map時遇到損壞,則您的比較功能可能不符合嚴格的弱排序要求

  • 不自反性: !(x < x)
  • 不對稱: !(x < y && y < x)
  • 傳遞性: x < y && y < z -> x < z
  • 不可比的傳遞性: !(x < y || y < x || y < z || z < y) -> !(x < z || z < x)

如果不滿足任何這些要求,將導致未定義的行為(例如,內存損壞)。

如果矩陣參與比較功能,則確保嚴格的弱排序的一種簡單方法是對其元素使用字典順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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