c++ - 在 Visual Studio 和 GCC 中使用 STL 排序排序

标签 c++ visual-c++ stl g++

编写应在 Linux 和 Windows 环境中可移植的程序 在使用 Visual Studio 和 gcc 进行编译时,我发现 STL 排序函数存在问题。 为了对复杂数据结构的 vector 进行排序,我为这种形式的结构编写了一个 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的vector等价于int的vector?

这里有一个简短的主要说明错误:

#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

最佳答案

我看到这两种比较方法之间唯一有意义的区别是,当元素为 const 时,第二种方法有效。第一个应该是:

//             vvvvv
operator int() const

即使您正在修改容器,您的比较仍然要求它适用于 const 对象。在您的情况下,实现使用了该假设并且出现了错误。

但这无关紧要,因为要对容器进行排序,它的元素需要是可修改的...

关于c++ - 在 Visual Studio 和 GCC 中使用 STL 排序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7896937/

相关文章:

c++ - 链表在当今世界的真正用途

c++ - 模板常量类型转换运算符在 linux (gcc) 下不起作用

c++ - Gnuplot Windows 在 Ubuntu 中立即消失

c++ - 对象指针随机指向 0x00000

c++ - 前向声明从嵌套模板中隐藏祖先模板参数

c++ - 将 std::string 插入到 std::fstream 中的任意位置

c++ - 我如何在键入 "exit"一词的命令提示符中退出?

visual-studio-2010 - 将文本文件作为本地资源包含在 exe 中

C++17:unique_ptr<char[]> 和shared_ptr<char[]> 之间指针存储的差异

c++ - <functional>中有功能组合的东西吗?