#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
using namespace std;
class C
{
public:
vector<int> CSort();
bool Func(int x, int y);
private:
vector<int> data;
};
vector<int> C::CSort()
{
vector<int> result(data.size(), 0);
iota(result.begin(), result.end(), 0);
sort(result.begin(), result.end(), Func);
return result;
}
bool C::Func(int x, int y)
{
return (data[x] > data[y]);
}
在上面定义的班级C
中,我希望使用成员函数data
获得std::sort
和Func
的订单向量。结果是错误
&#39; C :: Func&#39;:非标准语法;使用&#39;&amp;&#39;创建指向成员的指针
我认为这与Why doesn't reference-to-member exist in C++有关。
但是,我无法找到在std::sort
中引用此功能的正确方法。我该如何正确实现它?
答案 0 :(得分:1)
lambda会起作用:
#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
using namespace std;
class C
{
public:
vector<int> CSort();
bool Func(int x, int y);
private:
vector<int> data;
};
vector<int> C::CSort()
{
vector<int> result(data.size(), 0);
iota(data.begin(), data.end(), 0);
sort(data.begin(), data.end(), [this](auto& l, auto& r) {return Func(l, r); });
return result;
}
bool C::Func(int x, int y)
{
return (data[x] > data[y]);
}
int main()
{
C c;
}
或绑定:
#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
#include <functional>
using namespace std;
class C
{
public:
vector<int> CSort();
bool Func(int x, int y);
private:
vector<int> data;
};
vector<int> C::CSort()
{
vector<int> result(data.size(), 0);
iota(data.begin(), data.end(), 0);
sort(data.begin(), data.end(), std::bind(&C::Func,this,std::placeholders::_1,std::placeholders::_2));
return result;
}
bool C::Func(int x, int y)
{
return (data[x] > data[y]);
}
int main()
{
C c;
}
答案 1 :(得分:1)
您有几个选择:
如果您无法访问C ++ 11,您可以上学并实施自己的比较器来保存状态:
class C
{
friend struct MyComp;
public:
vector<int> CSort();
private:
vector<int> data;
};
struct MyComp
{
C* data;
MyComp(C* data) : data(data) {}
bool operator()(int x, int y)
{
return data->data[x] > data->data[y];
}
};
vector<int> C::CSort()
{
vector<int> result(data.size(), 0);
iota(data.begin(), data.end(), 0);
sort(data.begin(), data.end(), MyComp(this));
return result;
}
但是,如果你这样做,你可以使用lambda:
vector<int> C::CSort()
{
vector<int> result(data.size(), 0);
iota(data.begin(), data.end(), 0);
sort(data.begin(), data.end(), [this] (int x, int y) {
return (data[x] > data[y]);
});
return result;
}
答案 2 :(得分:0)
快速而肮脏的方式:将Func
移到课堂外。
#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
using namespace std;
class C
{
public:
vector<int> CSort();
private:
vector<int> data;
};
bool Func(int x, int y) {
return x > y;
}
vector<int> C::CSort()
{
vector<int> result(data.size(), 0);
// iota(data.begin(), data.end(), 0);
sort(data.begin(), data.end(), Func);
return result;
}