繁体   English   中英

C++,在 class 指针向量上使用 std::sort - 或者我无法正确命名我的函数

[英]C++, using std::sort on a vector of class pointers - OR I can't name my functions properly

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

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

我试图通过基于 class 中的字符串对 class (宋)指针的向量(cat)进行排序来找出 std::sort。

我特别试图在 Class 指针向量上调整此解决方案 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 不是 class function。 编译器返回

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

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

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

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

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

请注意,这里的 lambda 是通往 go 的方式,传递一个成员 function 指针(如在您的第一个示例中)不会像这样工作。

最后,确保包含<algorithm> header。

在这两种情况下,您都想调用std::sort() ,但是您进行的调用不符合您想要sort() ,因此编译器看到最近的sort()Catalog::sort()并尝试再次调用它,但由于参数不匹配而失败。

std::放在调用前面,例如:

void Catalog::sort()
{
    std::sort(...);
}

话虽如此,在这两个示例中,无论您对std::sort()谓词使用 function 还是 lambda ,它的return语句都可以简化为:

return a->getTitle() < b->getTitle();

如果第一个参数“小于”第二个参数,则谓词应返回true 假设getTitle()返回一个std::string ,它的本机operator<会为您返回确切的结果。 无需手动调用compare()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM