首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >memcmp排序

memcmp排序
EN

Stack Overflow用户
提问于 2009-02-24 18:52:02
回答 8查看 1.8K关注 0票数 0

我只有一个缓冲区,还有几个指向它的指针。我希望根据指针所指向的缓冲区中的字节对指针进行排序。

可以为qsort()和stl::sort()提供自定义比较函数。例如,如果缓冲区以零终止,我可以使用strcmp:

代码语言:javascript
复制
int my_strcmp(const void* a,const void* b) {
  const char* const one = *(const char**)a,
  const two = *(const char**)b;
  return ::strcmp(one,two);
}

但是,如果缓冲区不是以零结束的,我必须使用memcmp(),它需要一个长度参数。

有没有一种整洁、有效的方法来将缓冲区的长度放入我的比较函数中,而不需要全局变量?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-02-24 19:00:31

你不能空终止你的缓冲区有什么原因吗?

如果没有,因为您使用的是C++,所以您可以编写自己的函数对象:

代码语言:javascript
复制
 struct MyStrCmp {
    MyStrCmp (int n): length(n) { }
    inline bool operator< (char *lhs, char *rhs) {
       return ::strcmp (lhs, rhs, length);
    }
    int length;
 };
 // ...
 std::sort (myList.begin (), myList.end (), MyStrCmp (STR_LENGTH));
票数 3
EN

Stack Overflow用户

发布于 2009-02-24 19:01:01

使用std::sort,您可以像这样使用Functor:

代码语言:javascript
复制
struct CompString {
    CompString(int len) : m_Len(len) {}
    bool operator<(const char *a, const char *b) const {
        return std::memcmp(a, b, m_Len);
    }
private:
    int m_Len;
};

然后你可以这样做:

代码语言:javascript
复制
std::sort(begin(), end(), CompString(4)); // all strings are 4 chars long

编辑:来自评论建议的(我猜这两个字符串都在一个公共缓冲区中?):

代码语言:javascript
复制
struct CompString {
    CompString (const unsigned char* e) : end(e) {}
    bool operator()(const unsigned char *a, const unsigned char *b) const {
        return std::memcmp(a, b, std::min(end - a, end - b)) < 0;
    }
private:
    const unsigned char* const end;
};
票数 7
EN

Stack Overflow用户

发布于 2009-02-24 19:08:36

对于C函数qsort(),没有办法在不使用全局变量的情况下将长度传递给比较函数,这意味着它不能以线程安全的方式完成。有些系统有一个qsort_r()函数(r代表reentrant),它允许您传递一个额外的上下文参数,然后将该参数传递给比较函数:

代码语言:javascript
复制
int my_comparison_func(void *context, const void *a, const void *b)
{
    return memcmp(*(const void **)a, *(const void **)b, (size_t)context);
}

qsort_r(data, n, sizeof(void*), (void*)number_of_bytes_to_compare, &my_comparison_func);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/583063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档