我只有一个缓冲区,还有几个指向它的指针。我希望根据指针所指向的缓冲区中的字节对指针进行排序。
可以为qsort()和stl::sort()提供自定义比较函数。例如,如果缓冲区以零终止,我可以使用strcmp:
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(),它需要一个长度参数。
有没有一种整洁、有效的方法来将缓冲区的长度放入我的比较函数中,而不需要全局变量?
发布于 2009-02-24 19:00:31
你不能空终止你的缓冲区有什么原因吗?
如果没有,因为您使用的是C++,所以您可以编写自己的函数对象:
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));发布于 2009-02-24 19:01:01
使用std::sort,您可以像这样使用Functor:
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;
};然后你可以这样做:
std::sort(begin(), end(), CompString(4)); // all strings are 4 chars long编辑:来自评论建议的(我猜这两个字符串都在一个公共缓冲区中?):
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;
};发布于 2009-02-24 19:08:36
对于C函数qsort(),没有办法在不使用全局变量的情况下将长度传递给比较函数,这意味着它不能以线程安全的方式完成。有些系统有一个qsort_r()函数(r代表reentrant),它允许您传递一个额外的上下文参数,然后将该参数传递给比较函数:
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);https://stackoverflow.com/questions/583063
复制相似问题