映射在运行时选择`std :: greater`或`std :: less`

时间:2018-11-23 19:00:10

标签: c++

此行:

std::map<long int, long int, std::greater<long int>> current_book;

我想用逻辑上等价的代替它:

int Side = ...
if (Side == 1){
    std::map<long int, long int, std::greater<long int>> current_book;
} else {
    std::map<long int, long int, std::less<long int>> current_book;
}

3 个答案:

答案 0 :(得分:9)

您可以使用std::function

using mymap = std::map<long,long,std::function<bool(long,long)>>;
auto m = Side ? mymap( std::less<long>() ) : mymap( std::greater<long>() );

live example

答案 1 :(得分:7)

您必须实现一个自定义比较器类,类似于:


    from django.contrib.auth.models import User
    from .tasks import create_random_user_accounts
    from django.http import JsonResponse

    def users(request):
        obj = list(User.objects.values())
        # create_random_user_accounts.delay(20)
        return JsonResponse(obj,safe=False)

然后使用它,使用将比较器类的实例作为参数的构造函数,然后传入适当构造的比较器类实例,来构造您的地图:

class map_comparator {

   bool less_than;

public:

   map_comparator(bool less_than) : less_than{less_than} {}

   bool operator()(long a, long b) const
   {
       if (less_than)
             return a < b;
       return a > b;
   }
};

答案 2 :(得分:3)

您可以使用直线函数指针。这种方法不会因每次比较而{@ {1}}分支的开销或if (less_than)的开销而受到影响:

std::function