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

std::map::size() differs from iterators

本文关键字:迭代器 map size std      更新时间:2023-10-16

i使用std ::映射,带有自定义比较类和自定义类作为键

现在,我使用操作员[]通过键访问元素。但是,这似乎造成了一个大问题。该地图似乎错误地分配了元素,或者它们变得腐败。这变得很明显,因为当我的自定义比较类检测到其比较的一个对象中,它在其数据字段中存储了任意值(这似乎暗示构造函数未运行,或者对象从未在其中创建,这似乎是在其数据字段中存储的一个异常第一名)

现在出现另一个差异:

当我调用std :: map :: size()并将其与可以增加begin()迭代器的次数进行比较时,以获取端()迭代器,然后它们不匹配。

特别是该地图报告的尺寸()显然包含。

i用作键的类是带有数据字段的自定义矩阵类:

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()返回unsigned int

解决:

我使用Valgrind检查了任何内存访问错误...我发现程序的完全无关的部分Actuallz确实在已经删除的对象上删除了一个又一次的删除。...

似乎已破坏了地图存储在。

中的空间。

感谢所有好主意!

没有代码很难猜测,但是我还是会尝试的。

您知道T&amp;操作员[](const key_type&amp; x);如果密钥不存在,将值插入地图中的值?因此,如果您还没有地图中的密钥,地图大小将增加一个。

将使用默认构造函数创建元素。

如果您正在使用带有复杂用户定义键的map经历损坏,则可能不尊重严格弱订单的要求:

  • irreflexitive: !(x < x)
  • 不对称:!(x < y && y < x)
  • 传递性:x < y && y < z -> x < z
  • 无与伦比的传递性:!(x < y || y < x || y < z || z < y) -> !(x < z || z < x)

如果不满足这些要求,则将导致未定义的行为(例如内存损坏)。

如果矩阵参与了比较函数,则可以在其元素上使用词典订购来确保严格的订购。