Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ qsort类对象列表_C++_List_Class_Qsort - Fatal编程技术网

C++ qsort类对象列表

C++ qsort类对象列表,c++,list,class,qsort,C++,List,Class,Qsort,我正在为现有库编写排序代码,因此无法对数据模型进行更改 我有以下几点 class Point { //Some functions public: float x, y, z; }; int less_than_key (const void *arg1, const void *arg2) { Point *r1 = (Point*) arg1; Point *r2 = (Point*) arg2; if(r1

我正在为现有库编写排序代码,因此无法对数据模型进行更改 我有以下几点

 class Point
 {

   //Some functions 
   public:
       float x, y, z;

  };

int less_than_key (const void *arg1, const void *arg2)
 {

      Point *r1 = (Point*) arg1;
      Point *r2 = (Point*) arg2;

      if(r1->z < r2->z )
        return -1;

     else if(r1->z > r2->z )
       return 1;
    else
       return 0;
}

int main()
{
   list<Point> myPoints; 

    Point p;
    p.x = 0;
    p.y = 0;
    p.z = 0;
    myPoints.push_back(p);

    p.x = 0;
    p.y = 0;
    p.z = 6;
    myPoints.push_back(p);

    p.x = 0;
    p.y = 0;
    p.z = 2;
    myPoints.push_back(p);

    for(int i=0; i<myPoints.size(); i++)
      cout<<" Point "<<p[i].x<<", "<<p[i].y<<", "<<p[i].z<<"\n";

    qsort(&myPoints, myPoints.size(), sizeof(Point), less_than_key);

    for(int i=0; i<myPoints.size(); i++)
      cout<<"Point "<<p[i].x<<", "<<p[i].y<<", "<<p[i].z<<"\n";
 }
 Before sorting 
 Point 0, 0, 0
 Point 0, 0, 6
 Point 0, 0, 2

 After sorting 
 Point 0, 0, 0
 Point 0, 0, 2
 Point 0, 0, 6
   qsort(&myPoints[0], myPoints.size(), sizeof(Point), less_than_key);
  no match for 'operator[]' (operand types are 'std::list<Point>' and 'int')
当我运行以下代码时,它在排序调用期间崩溃,我得到以下错误

  terminated with signal 11
我在其他解决方案中读到,我应该通过以下列表

 class Point
 {

   //Some functions 
   public:
       float x, y, z;

  };

int less_than_key (const void *arg1, const void *arg2)
 {

      Point *r1 = (Point*) arg1;
      Point *r2 = (Point*) arg2;

      if(r1->z < r2->z )
        return -1;

     else if(r1->z > r2->z )
       return 1;
    else
       return 0;
}

int main()
{
   list<Point> myPoints; 

    Point p;
    p.x = 0;
    p.y = 0;
    p.z = 0;
    myPoints.push_back(p);

    p.x = 0;
    p.y = 0;
    p.z = 6;
    myPoints.push_back(p);

    p.x = 0;
    p.y = 0;
    p.z = 2;
    myPoints.push_back(p);

    for(int i=0; i<myPoints.size(); i++)
      cout<<" Point "<<p[i].x<<", "<<p[i].y<<", "<<p[i].z<<"\n";

    qsort(&myPoints, myPoints.size(), sizeof(Point), less_than_key);

    for(int i=0; i<myPoints.size(); i++)
      cout<<"Point "<<p[i].x<<", "<<p[i].y<<", "<<p[i].z<<"\n";
 }
 Before sorting 
 Point 0, 0, 0
 Point 0, 0, 6
 Point 0, 0, 2

 After sorting 
 Point 0, 0, 0
 Point 0, 0, 2
 Point 0, 0, 6
   qsort(&myPoints[0], myPoints.size(), sizeof(Point), less_than_key);
  no match for 'operator[]' (operand types are 'std::list<Point>' and 'int')
但是当我试图编译它时,我得到了以下结果

 class Point
 {

   //Some functions 
   public:
       float x, y, z;

  };

int less_than_key (const void *arg1, const void *arg2)
 {

      Point *r1 = (Point*) arg1;
      Point *r2 = (Point*) arg2;

      if(r1->z < r2->z )
        return -1;

     else if(r1->z > r2->z )
       return 1;
    else
       return 0;
}

int main()
{
   list<Point> myPoints; 

    Point p;
    p.x = 0;
    p.y = 0;
    p.z = 0;
    myPoints.push_back(p);

    p.x = 0;
    p.y = 0;
    p.z = 6;
    myPoints.push_back(p);

    p.x = 0;
    p.y = 0;
    p.z = 2;
    myPoints.push_back(p);

    for(int i=0; i<myPoints.size(); i++)
      cout<<" Point "<<p[i].x<<", "<<p[i].y<<", "<<p[i].z<<"\n";

    qsort(&myPoints, myPoints.size(), sizeof(Point), less_than_key);

    for(int i=0; i<myPoints.size(); i++)
      cout<<"Point "<<p[i].x<<", "<<p[i].y<<", "<<p[i].z<<"\n";
 }
 Before sorting 
 Point 0, 0, 0
 Point 0, 0, 6
 Point 0, 0, 2

 After sorting 
 Point 0, 0, 0
 Point 0, 0, 2
 Point 0, 0, 6
   qsort(&myPoints[0], myPoints.size(), sizeof(Point), less_than_key);
  no match for 'operator[]' (operand types are 'std::list<Point>' and 'int')
与“运算符[]”不匹配(操作数类型为“std::list”和“int”)

Stl列表有自己的排序函数,可以接受比较函数。您可以编写一个比较函数,该函数接受两个参考点对象并将其传递给myPoints.sort(…)


请参见[1]

Stl列表有自己的排序函数,该函数接受比较函数。您可以编写一个比较函数,该函数接受两个参考点对象并将其传递给myPoints.sort(…)


请参见[1]

您可以将std::sort与lambda expresion一起使用,下面是一个示例:

#include <algorithm>

std::list<Point> myPoints;

//adding points to list...

std::sort(myPoints.begin(), myPoints.end(), [](const Point& lhs, const Point& rhs)
{
   return lhs.z < rhs.z;
});

for(int i=0; i<myPoints.size(); i++)
  cout<<"Point "<<p[i].x<<", "<<p[i].y<<", "<<p[i].z<<"\n";
#包括
std::列出myPoints;
//正在将点添加到列表。。。
std::sort(myPoints.begin()、myPoints.end()、[](常量点和lhs、常量点和rhs)
{
返回左S.z<右S.z;
});

对于(int i=0;i您可以将std::sort与lambda expresion一起使用,下面是一个示例:

#include <algorithm>

std::list<Point> myPoints;

//adding points to list...

std::sort(myPoints.begin(), myPoints.end(), [](const Point& lhs, const Point& rhs)
{
   return lhs.z < rhs.z;
});

for(int i=0; i<myPoints.size(); i++)
  cout<<"Point "<<p[i].x<<", "<<p[i].y<<", "<<p[i].z<<"\n";
#包括
std::列出myPoints;
//正在将点添加到列表。。。
std::sort(myPoints.begin()、myPoints.end()、[](常量点和lhs、常量点和rhs)
{
返回左S.z<右S.z;
});

for(int i=0;i
qsort
是老式的C。它需要4个参数:

ptr-指向要排序的数组的指针

计数-数组中的元素数

size-数组中每个元素的大小(字节)

comp-返回的比较函数​如果第一个参数小于第二个参数,则为负整数值, 如果第一个参数大于第二个参数,则为正整数值;如果两个参数相等,则为零

它所给予的是

  • 指向
    列表的指针
  • 数组中的元素数
  • 数组中每个元素的大小(字节)
  • 比较函数
杀死你的是指向
list
的指针。我怀疑这是一个
std::list
,但无法证明这一点。不管它是什么,它是一个模板化的数据结构,这让事情变得棘手。它不是数组,不应该用作数组

qsort
尝试将其用作数组,并引用Dune:

他们尝试了,但失败了

他们试过了,死了

现在我们都知道,
列表
可能是一个非常复杂的数组,它包含一个
数组,该数组的位置与实例的开头对齐——所包含数组的地址与实例化的
列表
的地址相同——但崩溃表明情况并非如此

如果
list
是动态数组(根据其用法建议)或链表(根据名称和用法建议),则一个
列表
实例甚至不包含其数据。它包含一个指向数据的指针。没有可供
qsort
使用的数组,它将快速遍历
列表
中存储的少量数据,从另一边进入的疯狂世界。也就是说,您将非数组传递到
qs的实例ort
您已经遇到了未定义的行为


如果
list
具有迭代器接口,那么解决方案是使用C++。如果
list
确实是
std::list
,那么可能会有性能优势。如果两者都不是真的,并且
list
是一个不幸命名的自定义类,那么您必须编写自己的排序例程(或者做一件聪明的事,放弃自定义类而选择一个库容器)。

qsort
是老式的C。它需要4个参数:

ptr-指向要排序的数组的指针

计数-数组中的元素数

size-数组中每个元素的大小(字节)

comp-返回的比较函数​如果第一个参数小于第二个参数,则为负整数值, 如果第一个参数大于第二个参数,则为正整数值;如果两个参数相等,则为零

它所给予的是

  • 指向
    列表的指针
  • 数组中的元素数
  • 数组中每个元素的大小(字节)
  • 比较函数
杀死你的是指向
list
的指针。我怀疑这是一个
std::list
,但无法证明这一点。不管它是什么,它是一个模板化的数据结构,这让事情变得棘手。它不是数组,不应该用作数组

qsort
尝试将其用作数组,并引用Dune:

他们尝试了,但失败了

他们试过了,死了

现在我们都知道,
列表
可能是一个非常复杂的数组,它包含一个
数组,该数组的位置与实例的开头对齐——所包含数组的地址与实例化的
列表
的地址相同——但崩溃表明情况并非如此

如果
list
是动态数组(根据其用法建议)或链表(根据名称和用法建议),则一个
列表
实例甚至不包含其数据。它包含一个指向数据的指针。没有可供
qsort
使用的数组,它将快速遍历
列表
中存储的少量数据,从另一边进入的疯狂世界。也就是说,您将非数组传递到
qs的实例ort
您已经遇到了未定义的行为

如果
list
具有迭代器接口,那么解决方案是使用C++的。如果
list
确实是
std::list
,那么可能会有性能优势。如果两者都不是真的,那么