c++ - std::map::size() 不同于迭代器

标签 c++ memory stl iterator stdmap

我使用带有自定义比较类和自定义类作为键的 std::map

现在我使用 operator[] 来按键访问元素。然而,这似乎造成了一个大问题。该 map 似乎错误地分配了元素,或者它们已损坏。这变得很明显,因为当我的自定义比较类检测到它比较的对象之一在其数据字段中存储了任意值时抛出异常(这似乎暗示构造函数没有运行或者对象从未在第一名)

现在出现另一个差异:

当我调用 std::map::size() 并将其与我可以递增 begin() 迭代器以到达 end() 迭代器的次数进行比较时,它们不匹配。

特别是 map 报告的 size() 比它明显包含的更大。

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

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

然而,在这些类(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() 返回一个无符号整数

已解决:

我使用 valgrind 来检查任何内存访问错误...我发现程序 actualz 的一个完全不相关的部分确实对已删除的对象一遍又一遍地进行删除...

这似乎破坏了 map 存储项目的空间。

感谢所有好主意!

最佳答案

没有代码很难猜,但无论如何我都会尝试。

你知道吗 T& operator[] ( const key_type& x ) ;如果键不存在,在映射中插入值?因此,如果您还没有 map 中的键, map 大小将增加一。

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

关于c++ - std::map::size() 不同于迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13120089/

相关文章:

php - 是什么导致 PHPExcel 在使用分块过滤器读取文件时使用如此多的内存?

memory - Tomcat内存问题

c++ - 整数对散列函数的错误

c++ - 使用 CRTP 实现单例

c++ - 在 C++ 中获取广泛的类型错误

java - 使用 API21 编译时出现 UnsatisfiedLinkError

c# - 如何在 T 类型的单个变量(字段或 ref 参数)上创建长度为 1 的 Span<T>

c++ - 在构造函数的初始化列表中使用 std::initializer_list 初始化 std::array

c++ - 2-prop 排序列表的正确数据结构是什么?

c++ - libboost_log_setup.a 库的原因?