c++的sort排序(包括结构体)

sort排序

(一)、从小到大:sort()

int arr[]={2,3,4,52,1}
sort(arr,arr+5);

其中括号里面有两个部分,表示从第一个元素arr[0]到第五个元素arr[4]按从小到大的顺序排列

若写为:

sort(arr+i,arr+j)

表示被排序的是arr[i]到arr[j-1],其他元素保持原位置

(二)、从大到小:** greater<数据类型>()**

sort(arr,arr+5,greater<int>());

(三)、自定义一种从大到小排序的方法:cmp

bool cmp(int x,int y)
{
	return x>y;
}
int main(){
	int arr[10];
	for(int i=0;i<10;i++)
	{
		cin>>arr[i];
	}
	sort(arr,arr+10,cmp);
	//如果cmp返回结果为假, 那么函数就会将他们互换位置;
	//如果cmp返回结果为真,就会保持原来位置不变。
	
	//此时返回值为假
}

例题:
题意:有N个正整数,均小于10000,现在要将这些正整数按照除以3的余数从小到大排序,即除以3余0的数排在余1的数前面,余1在余2前面,如果余数相同,则按找正整数的值从小到大排序

输入格式:
第一行:N,0<N<101;
第二行:N个正整数,用空格隔开

#include<bits/stdc++.h>
using namespace std;
int num[105];//在全局定义数组 
bool cmp(int x,int y)
{
	if(x%3==y%3)//余数相同时 
	{
		return x<y;
	}
	else//余数不同时 
	{
		return x%3 <y%3;
	}
}

int main()
{
	int N;
	cin>>N;
	for (int i=0;i<N;i++)
	{
		cin>>num[i];
	}
	sort(num,num+N,cmp);
	//输出 
		for (int i=0;i<N;i++)
	{
		//末尾数不输出空格 
		if(i!=N-1)
		{
			cout<<num[i]<<' ';	
		}
		else
		{
			cout<<num[i]<<endl;
		 } 
		
	}
	return 0;
}

(三)、sort对结构体进行排序

1、首先初始化结构体,即对结构体赋值
原来的做法是一个一个赋值:如下

Student stu;
int score_input;
string name_input;
cin>>score_input>>name_input;
stu.name=name_input;
stu.score=score_input;

可以看到,以上手动给结构体赋值的很麻烦的

改进,用构造函数法,在结构体内进行赋值

struct Student{
	int score;
	string name;
	Student(string n,int s)
	{
		name=n;
		score=s;
	}
};

注意
1、函数名要和结构体名完全相同
2、不能定义返回值类型,也不能有return语句
3、有无形参都🆗,圆括号()内可以为空
4、,当构造函数的花括号里面没有参数,是空的时候称为默认构造函数,只能出现一个默认构造函数
5、竞赛中一般是采用初始化列表的方式:
Student (string n, int s):name(n),score(s){}
其中,花括号不能省略
不需要手动调用,当创建结构体的时候,构造函数会自动被调用

例子如下:

#include<bits/stdc++.h>
using namespace std;
struct Student
{
	int score;
	string name;
	//不要忘了默认构造函数,并且一下两行都不用分号; 
	Student(){} 
	Student(string n,int s):name(n),score(s){}
 } ;
 
 int main()
 {
 	Student stu[3];
 	for(int i=0;i<3;i++)
 	{
 		int s;
 		string n;
 		cin>>n>>s; //字符串也可以cin>>来输出 
 		stu[i]=Student(n,s);
	 }
	 for(int i=0;i<3;i++)
	 {
	 	cout<<stu[i].name<<' '<<stu[i].score<<endl;
	 }
	 
 }

在这里插入图片描述

接下来按姓名来排序,三名同学,四门成绩

#include<bits/stdc++.h>
using namespace std;
struct Student
{
	int score[4];
	string name;
 } ;
 //按照名字排序,从小到大, 
 bool cmp(Student x,Student y){
 	return x.name<y.name;
 } 
 int main()
 {
 	Student stu[3];
 	for(int i=0;i<3;i++)
 	{
 		cin>>stu[i].name;
 		for(int j=0;j<4;j++)
 		{
 			cin>>stu[i].score[j];
		}
	 }
	 sort(stu,stu+3,cmp);
	 for(int i=0;i<3;i++)
	 {
	 	cout<<stu[i].name<<':';
	 	for(int j=0;j<4;j++)
	 	{
	 		cout<<stu[i].score[j]<<' ';
		 }
		 cout<<endl; 
	 }
	 return 0;
 }

在这里插入图片描述

接下来按每门成绩从大到小排序

#include<bits/stdc++.h>
using namespace std;
struct Student
{
	int score[4];
	string name;
 } ; 
 bool cmp(Student x,Student y){
 	//这里不用else是因为一进来就return了! 
 	if(x.score[0]!=y.score[0])
	 {
	 	return x.score[0]>y.score[0];
	  } 
	   	if(x.score[1]!=y.score[1])
	 {
	 	return x.score[1]>y.score[1];
	  } 
	   	if(x.score[2]!=y.score[2])
	 {
	 	return x.score[2]>y.score[2];
	  } 
	   	if(x.score[3]!=y.score[3])
	 {
	 	return x.score[3]>y.score[3];
	  } 
 } 
 int main()
 {
 	Student stu[3];
 	for(int i=0;i<3;i++)
 	{
 		cin>>stu[i].name;
 		for(int j=0;j<4;j++)
 		{
 			cin>>stu[i].score[j];
		}
	 }
	 sort(stu,stu+3,cmp);
	 for(int i=0;i<3;i++)
	 {
	 	cout<<stu[i].name<<':';
	 	for(int j=0;j<4;j++)
	 	{
	 		cout<<stu[i].score[j]<<' ';
		 }
		 cout<<endl; 
	 }
	 return 0;
 }

在这里插入图片描述

接下来将两种方式整合

#include<bits/stdc++.h>
using namespace std;
struct Student
{
	int score[4];
	string name;
 } ; 
 //按照比较名字的方法排序
 bool cmp_name(Student x,Student y)
 {
 	return x.name<y.name;
 }
 bool cmp_score(Student x,Student y){
 	//这里不用else是因为一进来就return了! 
 	if(x.score[0]!=y.score[0])
	 {
	 	return x.score[0]>y.score[0];
	  } 
	   	if(x.score[1]!=y.score[1])
	 {
	 	return x.score[1]>y.score[1];
	  } 
	   	if(x.score[2]!=y.score[2])
	 {
	 	return x.score[2]>y.score[2];
	  } 
	   	if(x.score[3]!=y.score[3])
	 {
	 	return x.score[3]>y.score[3];
	  } 
 } 
 int main()
 {
 	Student stu[3];
 	for(int i=0;i<3;i++)
 	{
 		cin>>stu[i].name;
 		for(int j=0;j<4;j++)
 		{
 			cin>>stu[i].score[j];
		}
	 }
	 //name
	 sort(stu,stu+3,cmp_name);
	 for(int i=0;i<3;i++)
	 {
	 	cout<<stu[i].name<<':';
	 	for(int j=0;j<4;j++)
	 	{
	 		cout<<stu[i].score[j]<<' ';
		 }
		 cout<<endl; 
	 }
	 
	 
	//score
	sort(stu,stu+3,cmp_score);
	 for(int i=0;i<3;i++)
	 {
	 	cout<<stu[i].name<<':';
	 	for(int j=0;j<4;j++)
	 	{
	 		cout<<stu[i].score[j]<<' ';
		 }
		 cout<<endl; 
	 }
	 return 0;
 }


在这里插入图片描述

<think>好的,我现在需要回答用户关于OpenCV中cv2.drawContours函数的问题,特别是参数详解和如何填充轮廓。首先,我得回顾一下这个函数的用法和各个参数的作用。用户提到了填充、轮廓、颜色、厚度等参数,所以我要逐一解释这些参数的影响。 首先,函数的基本结构是cv2.drawContours(image, contours, contourIdx, color, thickness)。我记得contourIdx是轮廓的索引,如果是负数的话可能表示绘制所有轮廓。颜色通常用BGR元组表示,比如(0, 255, 0)是绿色。厚度参数如果是正数,就是轮廓线的粗细,如果是负数的话,可能表示填充轮廓。这点需要确认,比如当thickness设为-1或者cv2.FILLED时,应该会填充轮廓内部。不过OpenCV的不同版本可能有差异,需要确认正确的参数值。 接下来,用户提到的填充轮廓,所以需要详细说明如何通过设置thickness参数来实现填充。例如,当thickness=-1时,函数会填充轮廓区域。同时,color参数在填充时决定了填充的颜色。需要指出这一点,并给出示例,比如设置color为(255, 0, 0)会填充蓝色。 然后,关于contours参数,用户可能需要知道传入的轮廓结构是怎样的。通常contours是通过cv2.findContours获得的轮廓列表,每个轮廓是点的数组。contourIdx参数指定绘制哪一个轮廓,例如0表示第一个轮廓,-1表示所有。需要提醒用户注意索引的范围,避免越界错误。 另外,用户可能想知道各个参数的具体影响,比如不同的thickness值如何改变绘制效果,color如何影响轮廓颜色或填充色。可能还需要提到image参数是直接修改传入的图像,因此如果需要保留原图,应该先进行复制。 还要考虑是否要给出示例代码,帮助用户理解如何调用函数。例如,绘制所有轮廓并填充第三个轮廓,可以使用不同的参数设置。同时,结合用户提供的引用内容,比如引用[1]中的cv2.drawContours的参数,引用[2]中的轮廓近似可能相关,但用户的问题主要是绘制,所以可能不需要深入approxPolyDP的内容,但如果有优化绘制的方法可以提及。 最后,确保回答结构清晰,分点解释参数,并给出使用示例。同时,生成的相关问题需要与drawContours相关,比如参数作用、填充方法、颜色设置错误、轮廓绘制不显示的原因等,帮助用户进一步学习。</think>### OpenCV中cv2.drawContours函数参数详解 `cv2.drawContours` 是OpenCV中用于绘制轮廓的核心函数,其参数设置直接影响绘制效果。以下为参数说明及填充轮廓的实现方法: #### 函数语法 ```python cv2.drawContours(image, contours, contourIdx, color, thickness) ``` #### 参数解析 1. **`image`** - 输入输出图像,函数会直接在此图像上绘制轮廓。若需保留原图,应先使用`image.copy()`复制。 2. **`contours`** - 轮廓列表,通常由`cv2.findContours`函数检测得到。每个轮廓以点集形式存储,例如:`contours = [contour1, contour2, ...]`[^1]。 3. **`contourIdx`** - 指定要绘制的轮廓索引: - 输入`0`:仅绘制第一个轮廓; - 输入`-1`:绘制所有轮廓; - 输入`2`:绘制第三个轮廓(索引从0开始)。 4. **`color`** - 轮廓颜色,使用BGR格式: - 绿色:`(0, 255, 0)`; - 红色:`(0, 0, 255)`; - 填充时,此参数决定填充颜色。 5. **`thickness`** - 轮廓线粗细或填充模式: - `1`:细线; - `5`:粗线; - `-1`或`cv2.FILLED`:填充轮廓内部。 #### 填充轮廓的实现 将`thickness`设为`-1`即可填充轮廓: ```python # 绘制并填充第三个轮廓为蓝色 cv2.drawContours(image, contours, 2, (255, 0, 0), -1) ``` #### 示例代码 ```python import cv2 # 读取图像并转为灰度图 image = cv2.imread("input.jpg") gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 检测轮廓 contours, _ = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 绘制所有轮廓(绿色边框,粗细2) cv2.drawContours(image, contours, -1, (0, 255, 0), 2) # 填充第一个轮廓(红色) cv2.drawContours(image, contours, 0, (0, 0, 255), cv2.FILLED) ``` #### 注意事项 - **轮廓层级**:使用`cv2.findContours`时需注意轮廓检索模式(如`RETR_EXTERNAL`仅检测外轮廓)[^2]。 - **性能影响**:填充大面积轮廓会增加计算量,建议在需要时启用。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值