【问题标题】:Compare function for pair对的比较函数
【发布时间】:2016-03-15 02:44:31
【问题描述】:

我有一对:typdef pair <unsigned char *, vector<int>> pair_t

我需要为该地图实现自己的比较功能,所以我尝试了:

struct myCmp
{
   int operator()(unsigned char arr_1[10], unsigned char arr_2[10])
   {
    return memcmp(arr_1, arr_2, 10);
   }
};

typdef pair <unsigned char *, vector<int>, **myCmp**> pair_t;
pair_t data(someCharArr, someIntVector);

我得到的错误信息是:

模板参数的数量错误(3 应该是 2)

我对@9​​87654323@ 做了同样的事情,结果很好。

如何为pair创建自己的比较函数?

如何确定pair_t data(someCharArr, someIntVector);会找到正确的键(如果 char * 作为键)?

谢谢。

【问题讨论】:

  • 为什么不使用std::sting 而不是char *。如果您使用std::string,则内置的比较运算符应该可以工作。
  • std::pair 不采用比较运算符。它们已经根据对的组件进行了定义。
  • 我不能使用字符串,因为我得到的所有数据都是 char *,我不能确定 char * 不会包含任何会中断字符串比较的 '0' - 如果我会将 char * 转换为字符串
  • 在这种情况下,使用std::vector&lt;unsigned char&gt; 怎么样?您可以比较向量是否相等,小于和大于(它按字典顺序比较其元素,就像字符串一样),并且不会关心中间有 '\0'。

标签: c++ dictionary keyvaluepair


【解决方案1】:

您似乎对不同类的职责感到困惑。不是std::pair 需要担心如何比较对,而是std::map 需要担心如何对其键进行排序。

    typedef std::map<unsigned char*, std::vector<int>, myCmp> map_t;

从您如何实现比较功能以及您对为什么不能使用字符串的评论来看,我实际上建议使用std::array 而不是unsigned char *。你的代码看起来更像:

    typedef std::map<std::array<unsigned char, 10>, std::vector<int> > map_t;

这是因为std::array 实现了all the comparison operators 允许您将它们用作地图中的键。

这是因为您似乎在编译时就知道数组的长度,而且它始终为 10。如果您在编译时实际上不知道数组的长度,那么您会使用std::vector&lt;unsigned char&gt; 而不是std::array。

【讨论】:

    【解决方案2】:

    std::pair 只是一个有两个成员的结构体,它没有内置比较对象。

    您可能会对为 std::map 给出的比较对象感到困惑(它又持有 std::pair 的序列)。

    【讨论】:

    • 那么我如何确定pair_t data (someCharArr, someIntVector); 会找到正确的密钥?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多