首页 > 解决方案 > C++,在类指针向量上使用 std::sort - 或者我无法正确命名我的函数

问题描述

实际问题:我将我的函数命名为“排序”,它在没有指定标准的情况下调用排序,现在我觉得很愚蠢。

解决方案:重命名我的函数并从现在开始显式调用 std::sort (就像我的教授以外的每个人都建议我这样做)。

我试图通过根据该类中的字符串对类(Song)指针的向量(cat)进行排序来找出 std::sort 。

我特别试图在Class pointers 的向量上调整这个解决方案 std::sort(),但没有成功。

我能想到的最好的是:

void Catalog::sort()
{
       sort(cat.begin(), cat.end(), compareTitle );
       return;
}
bool compareTitle(Song* a, Song* b)
{
        return(a->getTitle().compare(b->getTitle()) < 0);
}

这里的 compareTitle 不是类函数。编译器返回

catalog.cpp: In member function ‘void Catalog::sort()’:
catalog.cpp:62:44: error: no matching function for call to ‘Catalog::sort(std::vector<Song*>::iterator, std::vector<Song*>::iterator, bool (&)(Song*, Song*))’
   62 |  sort(cat.begin(), cat.end(), compareTitle );
      |                                            ^
catalog.cpp:59:6: note: candidate: ‘void Catalog::sort()’
   59 | void Catalog::sort()
      |      ^~~~~~~
catalog.cpp:59:6: note:   candidate expects 0 arguments, 3 provided

我也试过

void Catalog::sort()
{
      sort(cat.begin(), cat.end(), [](Song* a, Song* b){
           return(a->getTitle().compare(b->getTitle()) < 0);
           });
        return;
}

这给了我

catalog.cpp: In member function ‘void Catalog::sort()’:
catalog.cpp:66:7: error: no matching function for call to ‘Catalog::sort(std::vector<Song*>::iterator, std::vector<Song*>::iterator, Catalog::sort()::<lambda(Song*, Song*)>)’
   66 |     } );
      |       ^
catalog.cpp:59:6: note: candidate: ‘void Catalog::sort()’
   59 | void Catalog::sort()
      |      ^~~~~~~
catalog.cpp:59:6: note:   candidate expects 0 arguments, 3 provided

任何建议表示赞赏;我的搜索没有结果。

标签: c++sortingstl

解决方案


您正在为名称查找的工作方式而苦苦挣扎。在Catalog::sort中,当您使用不合格的sort时,编译器会Catalog::sort再次出现 - 成员函数尝试调用自身。但是由于函数签名不匹配,编译器会抱怨。

您可以通过明确地为您的呼叫添加前缀来解决此问题,即

std::sort(cat.begin(), cat.end(),
    [](const Song *lhs, const Song *rhs) { /* ... */ });

请注意,这里的 lambda 是要走的路,传递成员函数指针(如在您的第一个示例中)不会像这样工作。

最后,确保<algorithm>包含标题。


推荐阅读