如何在内容保持关联时按字母顺序对结构数组进行排序

时间:2013-04-22 14:07:48

标签: c++ struct

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]

5 个答案:

答案 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)

由于您尝试比较两个chartitle[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