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;iqsort
是老式的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
,那么可能会有性能优势。如果两者都不是真的,那么