sort函数能对结构体进行排序吗?
比如我的结构体是:structnode{inta,b,c;}array[10001];我想用sort函数对b进行升序排序,该怎样写?谢谢。...
比如我的结构体是:struct node{ int a,b,c;}array[10001];我想用sort函数对b进行升序排序,该怎样写?谢谢。
展开
3个回答
推荐于2016-02-14 · 知道合伙人教育行家
关注
展开全部
std::sort()函数的功能很强大,且可以对类,结构体等元素进行排序。
首先来看看std中的快速排序算法sort的使用方法:
template <class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
这是一个带模板的函数,参数1和2表示需要排序的元素在随机迭代器的起始位置和结束位置,其迭代器指向的数据类型可以自己定义,常见的数据类型包括结构体,vector,类等都可以被使用。参数comp是用来决定所采用的排序是升序还是逆序的,默认情况下是升序排列。但是这种默认情况的优势是处理迭代器指向的元素为普通的数据类型,比如说整型,字符型等。如果指向的数据类型为类或者结构体,然后使用该类或者结构体中的某个元素进行排序,这时候需要自己定义排序的重载符号”<”。比如说在本次实验中该重载符号的定义为:
/*按照降序排列*/
bool compare(const PAIR &x, const PAIR &y)
{
return x.point_value > y.point_value;
}
如果将comp定义为一个函数(网上好像很多都是用这种类似的函数),比如说该函数如下:
/*按照降序排列*/
bool operator<(const PAIR &x, const PAIR &y)
{
return x.point_value > y.point_value;
}
则会报错如下错误:
std::sort因为函数参数不明确,所以无法推导出模板参数等.
实验结果
本次实验是基于这样一个问题的:有一些坐标点集合(2d的坐标点,坐标点之间没有重复),每个坐标点对应一个数,现在需要对这些数排序从而达到对这些坐标点排序。有尝试过把点的坐标和它对应的值放在map中,然后对map中的元素用std::sort()进行排序,但是由于开始没有发现那个重载符号的使用,所以没有调试成功。现在直接不用map了,而是用vector,vector里面放的是带有坐标点和其对应值的struct。
本次实验是在vector中存入3个结构体对象,每个结构体中放入一个二维点和它对应的值,然后采用sort()对齐排序,排序结果如下:
/*按照降序排列*/
bool operator<(const PAIR &x, const PAIR &y)
{
return x.point_value > y.point_value;
}
///*按照降序排列*/
//bool compare(const PAIR &x, const PAIR &y)
//{
// return x.point_value > y.point_value;
//}
void main()
{
PAIR pair1, pair2, pair3;
std::vector<PAIR> vec;
pair1.point = Point(10, 20);
pair1.point_value = 100;
pair2.point = Point(70, 30);
pair2.point_value = 99;
pair3.point = Point(44, 76);
pair3.point_value = 101;
vec.push_back(pair1);
vec.push_back(pair2);
vec.push_back(pair3);
// std::sort(vec.begin(), vec.end(), compare);
std::sort(vec.begin(), vec.end());
cout << "排序的结果为:" << endl;
for(vector<PAIR>::iterator it = vec.begin(); it != vec.end(); ++it) {
cout << it->point << endl;
首先来看看std中的快速排序算法sort的使用方法:
template <class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
这是一个带模板的函数,参数1和2表示需要排序的元素在随机迭代器的起始位置和结束位置,其迭代器指向的数据类型可以自己定义,常见的数据类型包括结构体,vector,类等都可以被使用。参数comp是用来决定所采用的排序是升序还是逆序的,默认情况下是升序排列。但是这种默认情况的优势是处理迭代器指向的元素为普通的数据类型,比如说整型,字符型等。如果指向的数据类型为类或者结构体,然后使用该类或者结构体中的某个元素进行排序,这时候需要自己定义排序的重载符号”<”。比如说在本次实验中该重载符号的定义为:
/*按照降序排列*/
bool compare(const PAIR &x, const PAIR &y)
{
return x.point_value > y.point_value;
}
如果将comp定义为一个函数(网上好像很多都是用这种类似的函数),比如说该函数如下:
/*按照降序排列*/
bool operator<(const PAIR &x, const PAIR &y)
{
return x.point_value > y.point_value;
}
则会报错如下错误:
std::sort因为函数参数不明确,所以无法推导出模板参数等.
实验结果
本次实验是基于这样一个问题的:有一些坐标点集合(2d的坐标点,坐标点之间没有重复),每个坐标点对应一个数,现在需要对这些数排序从而达到对这些坐标点排序。有尝试过把点的坐标和它对应的值放在map中,然后对map中的元素用std::sort()进行排序,但是由于开始没有发现那个重载符号的使用,所以没有调试成功。现在直接不用map了,而是用vector,vector里面放的是带有坐标点和其对应值的struct。
本次实验是在vector中存入3个结构体对象,每个结构体中放入一个二维点和它对应的值,然后采用sort()对齐排序,排序结果如下:
/*按照降序排列*/
bool operator<(const PAIR &x, const PAIR &y)
{
return x.point_value > y.point_value;
}
///*按照降序排列*/
//bool compare(const PAIR &x, const PAIR &y)
//{
// return x.point_value > y.point_value;
//}
void main()
{
PAIR pair1, pair2, pair3;
std::vector<PAIR> vec;
pair1.point = Point(10, 20);
pair1.point_value = 100;
pair2.point = Point(70, 30);
pair2.point_value = 99;
pair3.point = Point(44, 76);
pair3.point_value = 101;
vec.push_back(pair1);
vec.push_back(pair2);
vec.push_back(pair3);
// std::sort(vec.begin(), vec.end(), compare);
std::sort(vec.begin(), vec.end());
cout << "排序的结果为:" << endl;
for(vector<PAIR>::iterator it = vec.begin(); it != vec.end(); ++it) {
cout << it->point << endl;
展开全部
可以对结构体中的某一个署执行或字符串型的域进行排序,不能对结构体进行排序。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-08-18
展开全部
同类型结构体变量可以直接赋值的。
#include <stdio.h>
struct node
{
int a,b,c;
}array[10001],tmp;
void main()
{
//这里可以调用sort函数了
//它接受结构体数组和数组长度
//具体看你为结构体赋了多少值
}
void sort(struct node *a,int n)
{
int i,j;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[i].b>a[i+1].b)
{
tmp=a[i+1];
a[i+1]=a[i];
a[i]=tmp;
}
}
}
}
#include <stdio.h>
struct node
{
int a,b,c;
}array[10001],tmp;
void main()
{
//这里可以调用sort函数了
//它接受结构体数组和数组长度
//具体看你为结构体赋了多少值
}
void sort(struct node *a,int n)
{
int i,j;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[i].b>a[i+1].b)
{
tmp=a[i+1];
a[i+1]=a[i];
a[i]=tmp;
}
}
}
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询