【问题标题】:Unable to construct a Multimap with a given Datatype无法构造具有给定数据类型的 Multimap
【发布时间】:2018-07-31 16:38:59
【问题描述】:

我有自己的“3DSolid”类,我正在尝试将项目插入到 Multimap 所以,我这样定义我的 Multimap:

std::multimap< 3DSolid, 3DSolid > &SolidsolidMapping;

我正在插入这样的项目:

    SolidsolidMapping.insert( std::make_pair( solid1, solid2 ) );

其中solid1 和solid2 是我的类3DSolid 的对象。

所以,现在我收到一个关于“bool

所以,我这样定义运算符:

bool operator<( const 3DSolid& _Left, const 3DSolid& _Right )
{
    return _Left < _Right;
}

然后,我没有收到任何编译错误。但是当我运行我的程序时,它崩溃了,因为我定义的运算符没有任何意义。我只想构造一个未排序的 Multimap。我不关心“运算符

如果有人可以建议我对代码的更改,我将非常高兴 提前致谢。

【问题讨论】:

  • 我只想构造一个未排序的 Multimap。我不关心“运算符 您必须关心这一点,multimap 确实需要在插入的元素之间进行排序。
  • @Gaurav Sehgal:我尝试使用数据结构 std::unsorted_multimap,但我仍然收到错误,因为我使用的类 Object 不是典型的 C++ 类对象
  • 如果您无法在不同的3DSolid 之间定义排序,则不能使用任何需要排序的容器(mapmultimap 等)。
  • “不是典型的 C++ 类对象”是什么意思?

标签: c++ data-structures


【解决方案1】:

来自cppreference.com(突出显示我的):

Multimap 是一个关联容器,其中包含 排序 列表 键值对,同时允许多个条目具有相同的键。

如果您无法对项目进行排序,则multimap 不是您想要的。如果您的项目没有有意义的比较函数,请尝试使用明确无序的结构,例如 unordered multimap。这种区别的原因是随机访问之类的操作在已排序的数据集上效率更高。

【讨论】:

  • 我应该可以使用“unsorted_multimap”吧??
【解决方案2】:

其他人已经解释了为什么您应该使用multimap,而是使用unsorted_multimap

然后,我没有收到任何编译错误。但是当我运行我的程序时,它 崩溃。

程序崩溃的问题在于,您的重载运算符递归调用它自己,并由于递归调用导致堆栈溢出。见here

bool operator<( const 3DSolid& _Left, const 3DSolid& _Right )
{
    return _Left < _Right;
}

正确的运算符重载方法应该使用它的成员(参见here),如下所示:

bool operator<( const 3DSolid& _Left, const 3DSolid& _Right )
{
    return _Left.getBar() < _Right.getBar();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    相关资源
    最近更新 更多