struct Album {
string title;
string year;
string track;
vector<string> tracks;
}MyAlbums[5];
int j;
Album temp;
for(int i = 1; i < 5; i++)
{
j = i - 1;
while( j >= 0 && strcmp( MyAlbums[j+1].title[0], MyAlbums[j].title[0]) < 0 ){
temp = MyAlbums[j + 1];
MyAlbums[j+1] = MyAlbums[j];
MyAlbums[j] = temp;
j--;
}
}
给我这个:从'char'无效转换为'const char *'[-fpermissive]
答案 0 :(得分:3)
C ++
struct Album {
string title;
string year;
string track;
vector<string> tracks;
bool operator<(const Album &a) const
{
return title.compare(a.title) > 0;
}
} MyAlbums[5];
std::sort(std::begin(MyAlbums), std::end(MyAlbums));
C ++ 11
std::sort(std::begin(MyAlbums), std::end(MyAlbums), [](const Album &a1, const Album &a2 ){
return a1.title.compare(a2.title) > 0;
});
答案 1 :(得分:2)
出现错误,因为您正在比较MyAlbums[j+1].title[0]
; std::string
的第一个元素,即char
(或const char
)但不是const char*
!
可能你想要:
strcmp(MyAlbums[j+1].title.c_str(), MyAlbums[j].title.c_str())) < 0
哪种语法正确,但不确定逻辑。
由于您使用的是C ++,因此可以考虑使用std::sort(..)
。
另一种方法是更改您的设计并使用std::map(..)
。这里所有数据都将在 order 中,可以使用迭代器(向前或向后)进行迭代。另一方面,您可以使用地图键轻松访问。
答案 2 :(得分:1)
您正在使用STL课程,那么为什么要在strcmp
时使用title.compare(title2)
?
由于您尝试比较两个char
(title[0]
)而不是char*
,因此您也在以不正确的方式使用它。
您可以使用自定义比较器,例如
struct cmp_str {
bool operator()(const Album &a, const Album &b) {
return a.title.compare(b.title) < 0;
}
};
并使用std:sort(..)
答案 3 :(得分:0)
strcmp
需要const char*
。
MyAlbums[j+1].title[0]
返回char
。
您最好的选择是使用std::sort
并为operator<()
定义Album
。您还可以在.c_str()
上使用title
。
有关strcmp的更多信息。
答案 4 :(得分:0)
std::string
有一个可以使用的比较方法。
while( j >= 0 && MyAlbums[j+1].title.compare(MyAlumbus[j].title) < 0)
{ ... }
此外,
MyAlumbus[j].title[0]
在operator[]
上调用重载的std::string
,它会拉出第一个字符。
strcmp ( const char * str1, const char * str2 )
是strcmp
的签名。它需要char *
,而您只需提供char
。