1
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]

4

5 回答 5

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;
});
于 2013-04-22T14:11:17.173 回答
2

出现错误,因为您正在比较MyAlbums[j+1].title[0];的第一个元素std::string,它是 a char(或 a const char)但不是 a const char*

可能你想要:

strcmp(MyAlbums[j+1].title.c_str(), MyAlbums[j].title.c_str())) < 0

这在语法上是正确的,但不确定逻辑。

由于您使用的是 C++,因此您可以考虑使用std::sort(..).

另一种选择是改变你的设计和使用std::map(..)。在这里,您的所有数据都是有序的,可以使用迭代器(向前或向后)进行迭代。另一方面,您可以使用地图键轻松访问。

于 2013-04-22T14:12:22.710 回答
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(..)

于 2013-04-22T14:11:24.020 回答
0

strcmp需要一个const char*.

MyAlbums[j+1].title[0]返回一个char

您最好的选择是使用std::sort和定义operator<()for Album。您也可以.c_str()使用title.

有关strcmp的更多信息。

于 2013-04-22T14:11:54.797 回答
0

std::string有一个可以使用的比较方法。

while( j >= 0 && MyAlbums[j+1].title.compare(MyAlumbus[j].title) < 0)
{ ... }

还,

MyAlumbus[j].title[0]在 a 上调​​用一个重载operator[]的 astd::string来取出第一个字符。

strcmp ( const char * str1, const char * str2 )是 的签名strcmp。它需要一个char *, 而你只是提供一个char.

于 2013-04-22T14:12:49.923 回答