Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C型比较器对数组进行排序_C++_Std - Fatal编程技术网

C++ 使用C型比较器对数组进行排序

C++ 使用C型比较器对数组进行排序,c++,std,C++,Std,我需要实现一个将从C调用的排序函数。接口看起来是这样的(尽管我或其他人很想更改它,但我不能): 我可以用C++实现这个函数,但是我不能改变接口。我可以看到三件事要做: 编写我自己的排序函数。这听起来是个坏主意,从那时起,我们负责维护它,在C或C++标准库中实现一些东西,并且不花费三周或更长时间,将很难实现。 打电话给qsort。这里的问题是,比较器将void*作为第三个参数,这基本上是调用方希望传递的任何内容,以帮助实现比较器 在函数指针周围使用std::sort和comparator包装器。这

我需要实现一个将从C调用的排序函数。接口看起来是这样的(尽管我或其他人很想更改它,但我不能):

<>我可以用C++实现这个函数,但是我不能改变接口。我可以看到三件事要做:

  • 编写我自己的排序函数。这听起来是个坏主意,从那时起,我们负责维护它,在C或C++标准库中实现一些东西,并且不花费三周或更长时间,将很难实现。
  • 打电话给qsort。这里的问题是,比较器将void*作为第三个参数,这基本上是调用方希望传递的任何内容,以帮助实现比较器
  • 在函数指针周围使用std::sort和comparator包装器。这是我最喜欢的选择,因为它似乎比其他三个更容易
  • 此外,无论我选择什么实现,都需要线程安全,因此我不能为指向userData的指针分配一些静态全局值,并使用该全局值将userData传递给比较器

    无论如何,假设第3个是我想去的地方(尽管我对其他选项持开放态度),我的问题是:我可以很容易地设置一个封装函数指针的函子,但我不知道将void*指针转换到什么位置,以便调用sort

    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);