C++算法题常用API

最近在备考天梯赛,发现其中题目对Java选手不太友好,同样的算法往往需要修改成C/C++才能得到满分,因此重新捡回来一些C++的知识

1. 头文件

使用内置函数时往往需要调入相应的头文件,对于新手而言可能对这些头文件不太熟悉,因此直接用一条语句将所有头文件调入即可

#include<bits/stdc++.h>
using namespace std;    //有此语句才能使用cin和cout,可以简单这么理解

2. 输入输出

//若是读取时以空格作为分隔符则使用cin<<
//若是要读取空格,以回车作为分隔符则使用getline()
getline(cin,str);		//string类型的str接收一整行数据
cin.getline(arr,20);	//将输入放进大小为20的char数组中
//若只是输出结果,无特殊格式要求,则使用cout<<
//若输出是小数且对格式有所要求则使用printf()
//%s对应string,%c对应char,%d对应int,%f对应float,%lf对应double
double sum=1.664;
printf("sum is %06.2lf",sum);//输出结果总共占6位[包括小数点],其中小数占2位,不足的部分用0填充
//最后输出sum is 001.66

3. 常用API

3.1 字符串string

输入与遍历

string str; 	//定义一个字符串类型str
cin>>str;		//接收输入的字符串,读取时跳过空格和回车,且以空格或回车符作为结束标志
getline(cin,str);	//接收输入流,读取时不跳过空格和回车,且以回车作为结束标志
//遍历时直接for循环用下标对str进行访问即可

字符串转十进制

stringstream ss1;		//创建一字符串流
int result;
ss1<<"17";				//将字符串"17"放入
ss1>>result;			//以10进制的形式解析先前放入的数据并将结果压入result中
ss1.clear();			//初始化流
ss1<<"17";
ss1>>hex>>result;		//以16进制的形式解析先前放入的数据并将结果压入result中
//二进制转十进制、十进制转二进制可以用位运算和移位运算

方法

s.length();		//返回字符串大小
//C++中比较两个字符串是否相等可直接用运算符 
//s的[left1,right1]与str的[left2,right2]相比较,ASK码逐个相减,
s.compare(left1,right1,str,left2,right2);	//若不填left与right,则默认为整个字符串 
s.push_back(char);			//在尾部插入一字符 
string::iterator iter=s.begin();//得到字符串迭代器,初始时指向头部,可用下标向后访问
s.insert(iterator,char);		//在迭代器[由begin()或end()得到]指向位置前插入一字符 
s.append(string);		//在s后追加字符串
s.erase(iterator);	//删除迭代器所指的字符
s.erase(int left,int length);	//删除从下标left开始往后length个字符
s.replace(int left,int length,string target);//将下标从left往后的length个字符替换为target
s[i]=toupper(s[i]);//将s[i]指向的字符变大写并赋值给s[i],tolower()同理
s.find(string);	//查找目标字符串第一次出现的下标位置
s.find(char,index);	//从index下标开始查找字符第一次出现的位置
sort(s.begin(),s.end());	//按照字典序进行排序,包前不包后
s.substr(int left,int length);	//从下标left开始往后截取length个长度

3.2 栈stack和队列queue

//队列queue用法同栈
stack<int> s1;	//声明一个栈
s1.empty();		//判断是否为空
s1.pop();		//出栈但不返回值
s1.push(int);	//入栈
s1.size();		//返回栈元素个数
s1.top();		//取栈顶元素

3.3 排序sort

排序规则返回true时不交换,返回false时交换,正好与java规则相反

sort(arr,arr+length,less<int>());		//对arr数组从小到大排序[默认]
sort(arr,arr+length,greater<int>());	//从大到小排序
//对结构体自定义排序
typedef struct Node{
	int val;
}Node; 
//a可理解为前面的元素,b理解为后面的元素
bool compare(Node a,Node b){
    //如果前面元素大于后面元素就不交换,所以这是从大到小排序
	return a.val>b.val;	//大于0不交换 
}
	Node arr[3];	 
	for(int i=0;i<3;i++){
		arr[i].val=i;//初始小到大
	}
	sort(arr,arr+3,compare);//经过排序后变根据val从大到小
//对字符串自定义排序
//字符串里的每个字符实则是char
bool compare(char a,char b){
    //a大于b时不交换,说明前面的数ASK码小,是字典逆序
	return a>b;	//大于0不交换 
}
string s="abc";	//初始为字典序
sort(s.begin(),s.end(),compare);	//排序后为字典逆序

3.4 动态数组vector

vector<int> arr;
//当元素存在之后可直接用下标访问 
arr.back();	//返回arr的最后一个元素
arr.front();	//返回arr的第一个元素
arr.empty();	//返回arr是否为空
arr.pop_back();	//删除arr的最后一个元素
arr.push_back(int);	//在末尾增加一个元素 
arr.size();		//返回当前元素个数 
arr.erase(arr.begin(),arr.begin()+1);	//删除迭代器指向的元素,包前不包后,此处仅删arr[0] 
arr.insert(arr.begin(),5);		//迭代器所指向的位置插入5,原来这个位置的元素被挤到后面
//比较两个vector是否相等可以直接使用运算符
arr.swap(arr2);	//将其内容进行整体交换 
sort(arr.begin(),arr.end()); //进行从小到大排列,范围包前不包后,end()指向最后一个元素的后一个
reverse(arr.begin(),arr.end());	//内容反转,范围包前不包后

3.5 优先级队列priority_queue

//构造一个大顶堆,堆中小于当前节点的元素需要下沉,因此使用less
priority_queue<int, vector<int>, less<int>> queue;
//构造一个小顶堆,堆中大于当前节点的元素需要下沉,因此使用greater
priority_queue<string, vector<string>, greater<string>> queue;

p.empty();	//堆是否为空 
p.pop();	//将队列头移出,但是不返回值 
p.push();	//压入元素 
p.size();	//返回堆大小 
p.top();	//得到堆顶元素值 

3.6 哈希表unordered_map

unordered_map<int,string> map; //创建一个[关键字,键值]为[int,string]的哈希表
map.insert(pair<int,string>(1, "tom"));//插入映射对[1,"tom"]到哈希表中
map[i]="jack";	//插入映射对[i,"jack"],i可以为任何int型数据
map.count(key)  //判断map是否存在存在key值,有则返回1,反之返回0
map.size();		//返回哈希表大小
map.empty();	//判断哈希表是否为空
map.at(key);	//返回key对应的value

//删除某个映射对只能通过迭代器进行删除
//find()若找不到key值则会返回map.end()
unordered_map<int,string>::iterator iter=map.find(key);
	if(iter!=map.end()){	//说明成功找到
		map.erase(iter);	//删除此迭代器指向的映射对
	}
//遍历方式
for (auto p : map) {
	int front = p.first;   //key
    string end = p.second;   //value
}

3.7 哈希集合set

set<int> s;		//声明一个int型的Set
insert(int)		//在集合中插入元素 
begin()			//返回指向第一个元素的迭代器 
clear()			//清除所有元素 
empty()			//如果集合为空,返回true 
end()			//返回指向最后一个元素的迭代器,此时指向空 
erase(int)		//删除集合中的元素
find(int)			//返回一个指向被查找到元素的迭代器
size()			//集合中元素的数目
  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于暗通道先验和双边滤波的去雾算法是一种比较常用的去雾算法,OpenCV中也提供了相应的API支持。下面我将给出一个基于OpenCV C++ API实现的去雾算法的示例代码。 ```cpp #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc, char** argv) { // 读取输入图像 Mat image = imread(argv[1], IMREAD_COLOR); if (image.empty()) { cerr << "Failed to read image: " << argv[1] << endl; return -1; } // 转换为浮点类型 Mat img_float; image.convertTo(img_float, CV_32FC3, 1.0 / 255.0); // 计算暗通道图像 Mat dark_channel; cvtColor(img_float, dark_channel, COLOR_BGR2GRAY); int patch_size = 15; for (int i = 0; i < dark_channel.rows; i++) { for (int j = 0; j < dark_channel.cols; j++) { int x1 = max(j - patch_size / 2, 0); int y1 = max(i - patch_size / 2, 0); int x2 = min(j + patch_size / 2, dark_channel.cols - 1); int y2 = min(i + patch_size / 2, dark_channel.rows - 1); Scalar minVal; minMaxLoc(dark_channel(Rect(x1, y1, x2 - x1 + 1, y2 - y1 + 1)), &minVal); dark_channel.at<float>(i, j) = minVal[0]; } } // 计算大气光 Scalar airlight = mean(img_float.reshape(3), dark_channel > 0.1); // 计算透射率 double omega = 0.95; Mat transmission = 1 - omega * dark_channel / airlight[0]; // 双边滤波 int filter_size = 15; Mat img_filtered; bilateralFilter(img_float, img_filtered, filter_size, 0.1, 10.0); // 恢复原始图像 Mat img_dehazed = (img_filtered - airlight[0]) / max(transmission, 0.1) + airlight[0]; img_dehazed.convertTo(img_dehazed, CV_8UC3, 255.0); // 显示结果 imshow("Input Image", image); imshow("Dehazed Image", img_dehazed); waitKey(0); return 0; } ``` 上述代码中,首先读入输入图像并将其转换为浮点类型。然后计算暗通道图像,并根据暗通道图像估计大气光。接着计算透射率,并使用双边滤波进行图像去噪。最后根据透射率和大气光恢复原始图像,并将其转换为8位无符号整型格式。最后显示输入图像和去雾后的图像。 需要注意的是,该算法的具体参数需要根据实际情况进行调整,以获得最佳效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值