gpt4 book ai didi

c++ - 在条件中委托(delegate) std::less 或 std::greater

转载 作者:太空宇宙 更新时间:2023-11-04 13:17:23 25 4
gpt4 key购买 nike

我已经实现了一个测试用例,其中我可以将 key 作为自定义类,如下所示:

#include <iostream>
#include <map>

using namespace std;

class CoordinateValue
{
public:

short int x_;
short int y_;

CoordinateValue(short int x = 0, short int y = 0)
: x_(x),y_(y)
{

}

bool operator<=(const CoordinateValue &right) const
{
return ((this->x_ <= right.x_) && (this->y_ <= right.y_));
}

bool operator<(const CoordinateValue &right) const
{
return ((this->x_ < right.x_) && (this->y_ < right.y_));
}

bool operator>=(const CoordinateValue &right) const
{
return ((this->x_ >= right.x_) && (this->y_ >= right.y_));
}

bool operator>(const CoordinateValue &right) const
{
return ((this->x_ > right.x_) && (this->y_ > right.y_));
}


friend ostream &operator<<(ostream &out, const CoordinateValue &val)
{
out << "[ " << val.x_ << "," << val.y_ << " ]" << std::endl;

return out;
}
} ;

int main()
{

std::multimap<CoordinateValue,int,std::less_equal<CoordinateValue>> intersectionIn;


intersectionIn.insert(std::pair<CoordinateValue,int>(CoordinateValue(100,200),12));
intersectionIn.insert(std::pair<CoordinateValue,int>(CoordinateValue(1000,7),135));
intersectionIn.insert(std::pair<CoordinateValue,int>(CoordinateValue(0,2),112));
intersectionIn.insert(std::pair<CoordinateValue,int>(CoordinateValue(-10,-200),12));
intersectionIn.insert(std::pair<CoordinateValue,int>(CoordinateValue(-100,-200),12));
intersectionIn.insert(std::pair<CoordinateValue,int>(CoordinateValue(1000,2000),12));

std::multimap<CoordinateValue,int,std::greater<CoordinateValue>>::const_iterator iter = intersectionIn.begin();

while(iter != intersectionIn.end())
{
std::cout << iter->first;
++iter;
}

return 0;
}

现在我想根据某些条件调用 std::greater/std::less/std::less_equal 。我如何委托(delegate)?例如,对于一种情况,我使用 std::less 声明容器,对于另一种情况,我使用 std::greater 声明容器。

一些提示或引用会很棒。

谢谢

最佳答案

看起来你想要一个运行时版本(来自你的评论),你可以使用类型 std::function<bool(int, int)>作为你的Compare输入 multimap然后存储 std::lessstd::greater创建 map 时:

std::function<bool(int, int)> cmp;
if (...) {
cmp = std::less<int>();
}
else {
cmp = std::greater<int>();
}
std::multimap<int, int, decltype(cmp)> map(cmp);

ideone 上的代码:http://ideone.com/cP0OEm


下面是旧的编译时版本:

如果可以使用c++11 , 你可以使用 std::conditional :

template <typename T>
using cmp = typename std::conditional<cond, std::greater<T>, std::less<T>>::type;

在哪里cond是你的条件,可以链std::conditional对于多个条件。

然后:

std::multimap<int, int, cmp<int>> map;

因为你没有说你的条件是什么,我无法添加更多信息。

在你的评论之后,这可能看起来像这样:

template <int value, typename T>
using cmp = typename std::conditional<(value > 0), std::less<T>, std::greater<T>>::type;

std::multimap<int, int, cmp<MY_VALUE, int>> map;

在哪里MY_VALUE是一个编译时间常数。

关于c++ - 在条件中委托(delegate) std::less 或 std::greater,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36713622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com