如何使用此类中的成员函数调用 stl::nth_element
How to call stl::nth_element with a member function inside this class?
我想将函数nth_element
与我自己的排序函数(应该有权访问对象的数据(一起使用。 目前,我正在执行以下操作:
class Foo
{
public:
glm::vec3 *points;
int nmbPoints;
bool idxPointCompareX(int a, int b);
void bar();
}
bool Foo::idxPointCompareX(int a, int b)
{return points[a].x < points[b].x;)
void Foo::bar()
{
stl::vector<int> idxPointList;
for(int i = 0; i < nmbPoints; i++) idxPointList.push_back(i);
stl::nth_element(idxPointList.first(),idxPointList.first()+nmbPoints/2,idxPointList.end(), idxPointCompareX);
}
当然,这不起作用,我得到错误:"必须调用对非静态成员函数的引用"。之后,我看了一下必须调用的非静态成员函数的引用,如何使用成员函数初始化std::function
?以及这里的其他一些问题。我明白为什么这不起作用,但我不确定如何解决这个问题。
有人可以帮助我并告诉我如何解决这个问题吗?
要获取成员函数的地址,您需要使用正确的语法,即 &Foo::idxPointCompareX
不仅仅是idxPointCompareX
但是你还需要一个Foo
对象来调用函数,所以你需要将一个对象绑定到它。大概你的意思是this
调用它,所以你可以使用 std::bind
:
using namespace std::placeholders;
stl::nth_element(begin, begin+n, end,
std::bind(&Foo::idxPointCompareX, this, _1, _2));
或者更简单,使用 lambda 函数:
stl::nth_element(begin, begin+n, end,
[this](int a, int b) { return idxPointCompareX(a, b);}
);
这将创建一个 lambda 函数,该函数捕获this
并将其参数传递给捕获的this
指针上的 idxPointCompareX 函数。
idxPointCompareX
是一个成员函数,即如果不引用Foo
对象,就不能调用它。不过,看看它的定义,它似乎不需要是成员,因为它纯粹是根据其参数定义的。
你可以把它变成一个static
函数(即"类函数"(或一个自由函数,然后将其传递给std::nth_element
。
在创建对象方法之前,不能调用它,因此这里有一些选项:
-
使方法静态
-
将构造函数留空,并全部移动到调用比较部分的
init
方法中 -
使用λ
例子:
静态方法:
static bool idxPointCompareX(glm::vec3 a, glm::vec3 b)
{return a.x < b.x;)
初始化方法:
Foo::bar()
{
stl::vector<int> idxPointList;
for (int i = 0; i < nmbPoints; i++)
idxPointList.push_back(i);
}
Foo::init()
{
stl::nth_element(idxPointList.first(),
idxPointList.first()+nmbPoints/2,idxPointList.end(),
idxPointCompareX);
}
λ:
Foo::bar()
{
stl::vector<int> idxPointList;
for (int i = 0; i < nmbPoints; i++)
idxPointList.push_back(i);
stl::nth_element(idxPointList.first(),
idxPointList.first()+nmbPoints/2,idxPointList.end(),
[](int a, int b){return points[a].x < points[b].x;));
}
我会自己选择lambda版本。
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- 在STL容器中使用模板类
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 将stl字符串缩小到小于15个字符的容量
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- 在STL - C++中按成绩对学生列表进行排序?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- λ可以适应STL吗?
- 为什么使用 NDK 不能存在不同的 stl 实现?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 在C++中迭代 STL 集时出现奇怪的问题<CStudent>
- 如何在 C++17 STL 并行算法中处理调度?
- 在学习数据结构之前对STL有一个了解是好的吗?
- C++ STL 排序会检查 NaN 吗?