Заказ с использованием сортировки stl в Visual Studio и GCC - PullRequest
2 голосов
/ 26 октября 2011

При написании программы, которая должна быть переносимой в средах Linux и Windows, я обнаружил проблему с функцией сортировки STL при компиляции с Visual Studio и gcc.Чтобы отсортировать вектор сложных структур данных, я написал оператор преобразования int для структур в этой форме:

struct result
{ 
public :
  int Gene_a;
  int Gene_b;
  std::vector<int> score;
  float total_score;
  operator int() {return total_score;}
}

В этом случае у меня нет проблем в Visual Studio, использующей стандартный алгоритм сортировки для целых чисел.:

sort(results.rbegin(),results.rend());

Но при попытке скомпилировать это с помощью GCC (на самом деле g ++) это приводит к забавным ошибкам.Чтобы избежать этого, мне кажется, что я должен написать функцию упорядочения:

 inline bool better (result a, result b)
 {
   return a.total_score > b.total_score;
 }

и вызвать сортировку в виде:

sort(results.begin(),results.end(),better);

Использовал ли я что-то из стандарта C ++ илиотсутствие реализации g ++ STL?Можно ли позволить g ++ понять, что вектор struct эквивалентен вектору int?

Вот краткий пример, иллюстрирующий ошибку:

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) 
{
  vector<result> r;           // define a vector of struct
  for (int i=0;i<10;i++)      // fill up with data
  {
    result a;
    a.Gene_a=i;
    a.Gene_b=2*i;
    for(int j=0;j<i;j++)
      a.score.push_back(i); // fill the int vector in the struct
    a.total_score=i;
    r.push_back(a);
  }
  // sort(r.rbegin(),r.rend()); // this line will fail in g++
  sort(r.rbegin(),r.rend(),better);
  for (int i=0;i<10;i++)      // demonstrate that the int operator works
    cout << (int)r[i] << endl;
}// End main

1 Ответ

2 голосов
/ 26 октября 2011

Единственное значимое различие, которое я вижу между двумя методами сравнения, заключается в том, что второй будет работать, когда элемент равен const.Первое, вероятно, должно быть:

//             vvvvv
operator int() const

Даже если вы изменяете контейнер, ваше сравнение по-прежнему требует, чтобы он работал на const объектах.В вашем случае реализация использовала это предположение, и возникла ошибка.

Но это не должно иметь значения, поскольку для сортировки контейнера и его элементов необходимо изменить ...

...