[英]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.