C++ 使用C型比较器对数组进行排序
我需要实现一个将从C调用的排序函数。接口看起来是这样的(尽管我或其他人很想更改它,但我不能): <>我可以用C++实现这个函数,但是我不能改变接口。我可以看到三件事要做:C++ 使用C型比较器对数组进行排序,c++,std,C++,Std,我需要实现一个将从C调用的排序函数。接口看起来是这样的(尽管我或其他人很想更改它,但我不能): 我可以用C++实现这个函数,但是我不能改变接口。我可以看到三件事要做: 编写我自己的排序函数。这听起来是个坏主意,从那时起,我们负责维护它,在C或C++标准库中实现一些东西,并且不花费三周或更长时间,将很难实现。 打电话给qsort。这里的问题是,比较器将void*作为第三个参数,这基本上是调用方希望传递的任何内容,以帮助实现比较器 在函数指针周围使用std::sort和comparator包装器。这
template<typename T>
class ComparatorWrapper
{
public:
ComparatorWrapper(ComparatorFunc comparator, void* userData)
: comparator_(comparator),
userData_(userData)
{ }
bool operator()(const T& a, const T& b)
{
return comparator_(
reinterpret_cast<void*>(&a),
reinterpret_cast<void*>(&b),
context) < 0;
}
private:
ComparatorFunc comparator_;
void* userData_;
};
模板
类比较包装器
{
公众:
ComparatorWrapper(ComparatorFunc comparator,void*userData)
:比较器(比较器),
用户数据(用户数据)
{ }
布尔运算符()(常数T&a、常数T&b)
{
返回比较器_(
重新解释铸型(&a),
重新解释铸型(&b),
上下文)<0;
}
私人:
比较器func比较器;
void*用户数据;
};
对排序的调用应该如下所示:
T* foo = reinterpret_cast<T*>(ptr);
ComparatorWrapper<T> wrapper(comparator, userData);
std::sort(foo, foo+count, wrapper);
T*foo=reinterpret\u cast(ptr);
ComparatorWrapper(comparator,userData);
排序(foo,foo+count,包装器);
问题是我不知道t
应该是什么。我只知道sizeof(T)==size
。有什么想法吗
谢谢 为什么不使用线程本地存储我不建议使用它,只是为了您的信息,您可以将线程本地存储与qsort一起使用以确保线程安全线程本地存储很有趣。在Wintel系统上,访问和分配到本地线程的开销通常有多少?取决于您想要测量的单位:)一般来说,这相当昂贵
T* foo = reinterpret_cast<T*>(ptr);
ComparatorWrapper<T> wrapper(comparator, userData);
std::sort(foo, foo+count, wrapper);