Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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++ 对stl容器使用不带默认构造函数的函子_C++_Stl_Argument Passing_Functor_Default Constructor - Fatal编程技术网

C++ 对stl容器使用不带默认构造函数的函子

C++ 对stl容器使用不带默认构造函数的函子,c++,stl,argument-passing,functor,default-constructor,C++,Stl,Argument Passing,Functor,Default Constructor,我想为std::set使用我自己的比较器,它需要将一个参数传递给它的构造函数: template <class T = double> class EpsCompare { public: EpsCompare(T input_eps) : _eps(input_eps) {}; bool operator() (const T & element1, const T & element2) const { return ( roun

我想为
std::set
使用我自己的比较器,它需要将一个参数传递给它的构造函数:

template <class T = double> class EpsCompare {
  public:
    EpsCompare(T input_eps) : _eps(input_eps) {};
    bool operator() (const T & element1, const T & element2) const {
       return ( round(element1*_eps) < round(element2*_eps) );
    }
    T _eps;
};
模板类比较{
公众:
EpsCompare(T input_eps):_eps(input_eps){};
布尔运算符()(常量T和元素1,常量T和元素2)常量{
返回(第1轮(元素1*_eps)<第2轮(元素2*_eps));
}
T_eps;
};
如何将其传递给集合数据类型的声明?我想这样做:

std::set<double, EpsCompare<double>(1e-5)> myEpsSet;
std::设置myepset;
这是不可编译的,那么还有什么其他方法可以做到呢?

std::set myepset(EpsCompare(1e-5));
std::set<double, EpsCompare<> > myEpsSet(EpsCompare<>(1e-5));

std::set myepset(EpsCompare(1e-5));
像这样的东西

#include <iostream>
#include <set>

template <class T = double> class EpsCompare {
  public:
    EpsCompare(T input_eps) : _eps(input_eps) {};
    bool operator() (const T & element1, const T & element2) const {
       return ( round(element1*_eps) < round(element2*_eps) );
    }
    T _eps;
};


int main() 
{
    std::set<double, EpsCompare<double>> myEpsSet(EpsCompare<double>(1e-5) );

    return 0;
}
#包括
#包括
模板类比较{
公众:
EpsCompare(T input_eps):_eps(input_eps){};
布尔运算符()(常量T和元素1,常量T和元素2)常量{
返回(第1轮(元素1*_eps)<第2轮(元素2*_eps));
}
T_eps;
};
int main()
{
std::set myepset(epscope(1e-5));
返回0;
}

如果您想将
eps
作为参数传递给
std::set
您必须使其成为模板的一部分。您不能使用
double
作为模板参数,因此需要将power作为模板参数的解决方案之一:

template <class T, int power > class EpsCompare {
  public:
    EpsCompare() { eps = pow( 10, power ); }
    bool operator() (const T & element1, const T & element2) const {
       return ( round(element1*eps) < round(element2*eps) );
    }
  private:
       T eps;
};

std::set<double, EpsCompare<double,-5>> myEpsSet;

就足够了。

将实例传递给构造函数:您将被这个比较器烧坏。从未。曾经曾经使用。一ε。什么时候分类。数字。曾经。@n.m.为什么?我甚至不认为这是一个典型意义上的ε。@Angew你是对的,这不是一个常见的模糊比较,我的眼睛看到他们想要什么,而不是写什么:(至于为什么,模糊比较不是严格的弱排序,所以通常的算法不起作用。想象一个数字序列,每个数字都在下一个的ε范围内,但极值很远;您如何对它们进行排序?要设置的第二个模板参数应该是一个适当的类,这里它是一个类的实例(但不是类本身)是否有任何理由将
epspare
作为第二个参数传递给
std::set
template?@Slava,是的,这是必需的。与函数模板不同,模板参数不是从用于构造类模板实例的参数中推导出来的。我不明白。需要什么?如果不将其传递给template,则只传递给
std::set
ctor,它会有什么区别?@Slava
std::set
的第二个模板参数设置比较器的类型。默认情况下,它是
std::less
(其中
T
是第一个模板参数)但是你不希望使用类型为
std::less
的对象,你希望使用类型为
EpsCompare
的对象。我的问题实际上有点复杂,因为我没有尝试直接调用
myepset
,而是在类声明中调用。但是,在新类构造函数的初始值设定项中使用相同的对象完成了任务:
class Testclass{public:std::set myepset;Testclass():myepset(EpsCompare(1e-5)){};}
我以前尝试过类似的解决方案,但考虑到我真正想要传递的是间隔大小(可能是1.5或其他),我发现这是一个不令人满意的解决方法,不总是数字的数量…然后你必须在运行时传递它,除非你找到一种方法将它指定为多个整数,例如。
template <class T, int power > class EpsCompare {
  public:
    EpsCompare() { eps = pow( 10, power ); }
    bool operator() (const T & element1, const T & element2) const {
       return ( round(element1*eps) < round(element2*eps) );
    }
  private:
       T eps;
};

std::set<double, EpsCompare<double,-5>> myEpsSet;
std::set<double,EpsCompare<double>> myEpsSet( EpsCompare<double>( 1e-5 ) );