При написании программы, которая должна быть переносимой в средах 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