【问题标题】:C++ std_map doesn't iterate self-defined datatype [duplicate]C ++ std_map不迭代自定义数据类型[重复]
【发布时间】:2015-05-01 21:37:31
【问题描述】:

首先,我定义了自己的内存分配器,MyAllocator。 然后我使用我自己的内存分配器基于 std::map 定义我自己的映射:

template <typename K, typename V, typename Comparator = std::less<K>>
using MyMap = std::map<K, V, Comparator, MyAllocatorAdapter<std::pair<const K, V>>>;

所以用法是:

MyMap<std::string, float> my_map(std::less<std::string>(), allocator);

my_map["key1"] = 10.1
my_map["key2"] = 10.2
my_map["key3"] = 10.3

MyMap 在这里完美运行,[]、内联函数、迭代器等,就像 std::map 一样。好!

然后我定义我自己的类型,MyString,它也可以完美运行。

class MyString{
  ...define operators[], =, !=, find(),substr(), etc
}

但是当我在 MyMap 中使用它作为 key 时,问题来了!

MyMap<MyString, float> my_map(std::less<MyString>(), allocator);
MyString my_string="key1";

[]、函数、迭代器等大多数函数都失败了!

我调试进程序发现在

`/user/include/c++/4.8/bits/stl_mpl.h`, 

迭代器不动。 请注意,std::less 最终会调用 MyString 运算符!=,我会实现这个函数并且没有问题。 我被卡住并调试了2天!需要帮忙!谢谢!

【问题讨论】:

  • 我不相信std::less 会“最终调用 MyString 运算符!=”,正如你所说。仅仅使用!=,怎么可能确定两个字符串中的哪一个less
  • 阅读“严格弱排序”
  • 我有实现

标签: c++ c++11 iterator std


【解决方案1】:

std::less 呼叫operator&lt;。你需要实现它。

【讨论】:

  • 抱歉在我原来的帖子中描述有误,我实现了 MyString 的操作符
  • @MartinGGWW 这很糟糕,这样的operator&lt; 必须遵守strict weak order 的规则——你的运营商没有提供这些规则(例如,如果a &lt; b 为真,那么b &lt; a 必须是假)。
猜你喜欢
  • 2011-02-18
  • 2012-12-14
  • 2015-11-19
  • 2021-12-09
  • 1970-01-01
  • 2018-05-13
  • 2012-03-28
  • 1970-01-01
  • 2011-06-30
相关资源
最近更新 更多