std :: map :: size()与迭代器不同
std::map::size() differs from iterators
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)
如果不满足这些要求,则将导致未定义的行为(例如内存损坏)。
如果矩阵参与了比较函数,则可以在其元素上使用词典订购来确保严格的订购。
- 再次获得 std::map 会更改之前的迭代器
- 使用 map<char,strring> 的迭代器返回指针 map<char,strring>*
- 创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 为什么我不能在 c++ 中"map"的迭代器中使用"+1"?
- Map中的(字符串的)向量迭代器
- 访问基于范围的循环(如for_each)中的std::map迭代器
- map<int,int>的*迭代器是什么?它不是pair<int,int>
- std::map 擦除 - 将迭代器传递给错误的映射
- C++ Map erase(),迭代器打印 erased 元素
- 由于从 std::map 派生的类中的 std::map 迭代器导致的内存错误
- C++ std::map 和 std::set 擦除复制值,从而使迭代器失效
- 如果迭代器的迭代器永远不会无效,则是STD :: MAP访问线程安全
- SIGBUS 尝试递增 std::map 迭代器时
- C 迭代器从Typedef std :: Map作为模板参数声明
- std::map 线程安全和迭代器失效
- 为什么要对 map::find 应用不存在的键将返回一个C++中第一个值映射大小的迭代器
- 为 map<T1、T2> 迭代器创建模板函数
- std::map<>::迭代器错误
- std :: map :: size()与迭代器不同