C++ 如何使用;空排序(“空排序”、“空排序”、“空比较”);“的;算法";类中的头文件

C++ 如何使用;空排序(“空排序”、“空排序”、“空比较”);“的;算法";类中的头文件,c++,C++,我正在编写代码,无法从类内部使用sort()方法 class MyClass { struct MyStruct { ... } MyStructArr[10]; void fun() { ... // setting values of MyStructArr sort(MyStructArr, MyStructArr + 10, cmp); // !ERROR! } int cmp(stru

我正在编写代码,无法从类内部使用
sort()
方法

class MyClass {
    struct MyStruct {
        ...
    } MyStructArr[10];

    void fun() {
        ...  // setting values of MyStructArr
        sort(MyStructArr, MyStructArr + 10, cmp);     // !ERROR!
    }

    int cmp(struct MyStruct a, struct MyStruct b) {
        ...
    }
};
但同样的代码在没有类的情况下工作

struct MyStruct {
   ...
} MyStructArr[10];

int main() {
    ...  // setting values of MyStructArr
    sort(MyStructArr, MyStructArr + 10, cmp); 
    return 0;
}

int cmp(struct MyStruct a, struct MyStruct b) {
    ...
}
我无法理解为什么带有比较功能的
排序(…)
内部不工作 班级。
以下是错误:

SuffixArray.cpp: In member function 'void SuffixArray_Entry::suffixArray()':
SuffixArray.cpp:31:43: error: no matching function for call to 'sort(SuffixArray_Entry::SuffixArray_entry [65536], SuffixArray_Entry::SuffixArray_entry*, <unresolved overloaded function type>)'
             sort(L, L + N, SuffixArray_cmp);
                                           ^
SuffixArray.cpp:31:43: note: candidates are:
In file included from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\algorithm:62:0,
                 from SuffixArray.cpp:3:
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_algo.h:5461:5: note: template<class _RAIter> void std::sort(_RAIter, _RAIter)
     sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
     ^
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_algo.h:5461:5: note:   template argument deduction/substitution failed:
SuffixArray.cpp:31:43: note:   candidate expects 2 arguments, 3 provided
             sort(L, L + N, SuffixArray_cmp);
                                           ^
In file included from c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\algorithm:62:0,
                 from SuffixArray.cpp:3:
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_algo.h:5497:5: note: void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = SuffixArray_Entry::SuffixArray_entry*; _Compare = int (SuffixArray_Entry::*)(SuffixArray_Entry::SuffixArray_entry, SuffixArray_Entry::SuffixArray_entry)]
     sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
     ^
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_algo.h:5497:5: note:   no known conversion for argument 3 from '<unresolved overloaded function type>' to 'int (SuffixArray_Entry::*)(SuffixArray_Entry::SuffixArray_entry, SuffixArray_Entry::SuffixArray_entry)'
make.exe[2]: *** [build/Debug/MinGW-Windows/SuffixArray.o] Error 1
make.exe[2]: Leaving directory `/c/Users/Afzalex/Documents/NetBeansProjects/TestingStore/CPPStoreRoom'
make.exe[1]: *** [.build-conf] Error 2
make.exe[1]: Leaving directory `/c/Users/Afzalex/Documents/NetBeansProjects/TestingStore/CPPStoreRoom'
make.exe": *** [.build-impl] Error 2
SuffixArray.cpp:在成员函数“void SuffixArray_Entry::SuffixArray()”中:
cpp:31:43:错误:调用“sort(后缀数组项::后缀数组项[65536],后缀数组项::后缀数组项*,)时没有匹配函数
排序(L,L+N,后缀数组);
^
SuffixArray.cpp:31:43:注:候选人为:
在c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\algorithm:62:0中包含的文件中,
来自SuffixArray.cpp:3:
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl\u algo.h:5461:5:注意:模板void std::sort(\u RAIter,\u RAIter)
排序(_RandomAccessIterator uu first,_RandomAccessIterator u last)
^
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_algo.h:5461:5:注意:模板参数推导/替换失败:
SuffixArray.cpp:31:43:注意:候选者需要2个参数,提供3个参数
排序(L,L+N,后缀数组);
^
在c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\algorithm:62:0中包含的文件中,
来自SuffixArray.cpp:3:
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl\u algo.h:5497:5:注意:void std::sort(_RAIter,_RAIter,_Compare)[with _RAIter=SuffixArray\u Entry::SuffixArray\u Entry*;_Compare=int(SuffixArray\u Entry::*)(SuffixArray\u Entry::SuffixArray\u Entry::SuffixArray\u Entry)]
排序(_RandomAccessIterator uu first,_RandomAccessIterator u last,
^
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_algo.h:5497:5:注意:参数3从“”到“int”的转换未知(后缀数组项::*)(后缀数组项::后缀数组项,后缀数组项::后缀数组项)
make.exe[2]:***[build/Debug/MinGW-Windows/SuffixArray.o]错误1
make.exe[2]:离开目录“/c/Users/Afzalex/Documents/NetBeansProjects/TestingStore/cppstorroom”
make.exe[1]:***[.build conf]错误2
make.exe[1]:离开目录“/c/Users/Afzalex/Documents/NetBeansProjects/TestingStore/cppstorroom”
make.exe:***[.build impl]错误2

这是我的原始程序的错误堆栈跟踪。我正在使用Netbeans和MinGW

声明成员函数
cmp
作为静态成员函数。 考虑到如果函数的参数是引用会更好

另一种方法是在类内定义函数对象

class MyClass {
    struct MyStruct {
        ...
    } MyStructArr[10];

    struct cmp
    {
        bool operator ()( const struct MyStruct &a, const struct MyStruct &b ) const
        {
            //....
        }
    };

    void fun() {
        ...  // setting values of MyStructArr
        sort(MyStructArr, MyStructArr + 10, cmp());
    }

        ...

您还可以将
操作符声明成员函数
cmp
定义为静态成员函数。 考虑到如果函数的参数是引用会更好

另一种方法是在类内定义函数对象

class MyClass {
    struct MyStruct {
        ...
    } MyStructArr[10];

    struct cmp
    {
        bool operator ()( const struct MyStruct &a, const struct MyStruct &b ) const
        {
            //....
        }
    };

    void fun() {
        ...  // setting values of MyStructArr
        sort(MyStructArr, MyStructArr + 10, cmp());
    }

        ...

此外,您还可以定义
运算符
排序
将包含一些类似于以下内容的代码:

template <typename Iter, typename Cmp>
void sort(Iter begin, Iter end, Cmp cmp)
{
    // other code
    if (cmp(a, b)) {       // <-- !!!
        // Do something
    } else {
        // Do something else
    }
}
但是
sort
没有调用
cmp
MyClass
,它只有它真正想要比较的东西


您可以使您的
cmp
不依赖于
MyClass
(通过使其成为非成员函数或使其成为
static
),也可以使用lambda或
std::bind
或类似工具将
MyClass
的实例绑定到该类上。

sort
内部将有一些类似的代码:

template <typename Iter, typename Cmp>
void sort(Iter begin, Iter end, Cmp cmp)
{
    // other code
    if (cmp(a, b)) {       // <-- !!!
        // Do something
    } else {
        // Do something else
    }
}
但是
sort
没有调用
cmp
MyClass
,它只有它真正想要比较的东西


您可以使您的
cmp
不依赖于
MyClass
(通过使其成为非成员函数或使其成为
static
),也可以使用lambda或
std::bind
或类似工具将
MyClass
的实例绑定到它。

cmp
不能是非静态成员函数(而且它没有理由这样做)。将其设为静态。当您这样做时,可以将这些参数作为常量引用传递,并返回
bool
作为
排序
请求的规范。或者将其设为自由函数,如第二个示例中所示(尽管您必须从
MyClass
公开
MyStruct
,才能使其工作)
cmp
不能是非静态成员函数(而且它没有理由这样做)。将其设置为静态。在进行此操作时,可以将这些参数作为常量引用传递,并返回
bool
,作为
sort
请求的规范。或者将其设置为第二个示例中的免费函数(尽管您必须从
MyClass
公开
MyStruct
,才能使其正常工作)谢谢你,弗拉德。现在正在工作。请你告诉我一些我可以阅读的文档。(一些公认的或官方的文件)AfZaleX我建议N.M. Josuttis阅读“C++标准库”。谢谢弗拉德。现在正在工作。请你告诉我一些我能读到的文档。(一些公认的或官方的文件)@ AZALEX我建议读N.M.约瑟蒂斯的“C++标准库”。