算法初步——C++标准库
2021/8/1 17:35:57
本文主要是介绍算法初步——C++标准库,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- C标准库常用函数
- C++STL < vector >数组
- C++STL< string >字符串
- C++STL < algorithm >算法函数
- 1.sort 快排
- 2.其他algorithm函数
- 简单的6个函数
- `nth_element()`函数
- `unique()`函数
- `binary_search()`函数
- `lower_bound`函数和`upper_bound`函数
C标准库常用函数
<cstring>
strlen()字符串长度
strcmp()字符串比较
strcpy()字符串拷贝
memset()暴力清空数组
memcpy()暴力拷贝
2.<cstdlib>
qsort() C语言快排
rand() 随机数
malloc() free() C语言动态分配内存
3.<ctime>
time(0) 从1970年到现在的秒数,配合随机数
clock() 程序启动到目前位置的毫秒数
4.<cctype>
isdigit() 判断字符是否为数字
isalpha() 判断字符是否为英文字母,小写字母返回2,大写字母返回1,不为字母返回0
C++STL < vector >数组
常见操作:
vector<int>v; v.begin(); //数组的首元素迭代器 O(1) v.end(); //数组的最后一个元素的下一个元素的迭代器(该元素不存在) O(1) v.size(); //数组长度(元素个数) O(1) v.clear(); //一键清空数组 O(n) v.empty(); //判断数组是否为空 O(1) v.erase(it); //删除数组某个迭代器所在的位置的数字 O(n) v.push_back(5); //往数组后面添加元素 O(1) v.pop_back(); //删除数组后面最后一个元素 O(1)
C++STL< string >字符串
常见操作:
string s="hello"; string str1="world"; s.length();/s.size(); //求字符串长度 O(n) s.insert(2,"abc"); //在下标为2处插入一个字符或者字符串 O(n) s.insert(s.begin(),'a'); ///在迭代器处插入一个字符或者字符串 O(n) s.c_str(); //返回C语言的字符串,用于输出printf O(n) s.append(str1); //s+str s.compare(str); //strcmp(s,str1); s==str1 //strcmp(s.str1)==0; s+=str1 //s.append(str1); s+='a'; //s.push_back('a'); s+="aa";
C++STL < algorithm >算法函数
algorithm和之前两个头文件不同,它没有定义新的类型,只是定义了很多使用的算法,一个函数和传入的若干参数往往可以解决很多问题
1.sort 快排
int arr[]={4,5,2,1,3,6}; vector<int>v={4,5,2,1,3,6}; sort(arr,arr+6); //排序结果:1 2 3 4 5 6 sort(v.begin();v.end()); //排序结果:1 2 3 4 5 6 //O(nlogn) //sort函数里面有参数 //第一个参数是数组的头指针 //第二个参数是数组的最后一个元素的下一个元素的指针
//实际上还有第三个参数,如果第三个参数不写,sort将会从小到大排序 //第三个参数可以使用自定义的比较函数, //第三个参数也可以使用<functional>头文件里面的greater<type>和less<type> vector<int>v={4,5,2,1,3,6}; bool Mycompare(int a,int b) //自定义从大到小排序 return a>b; int main() { sort(v.begin(),v.end(),Mycompare); //排序结果:6 5 4 3 2 1 sort(v.begin(),v.end(),less<int>()) //排序结果:1 2 3 4 5 6 sort(v.begin(),v.end(),greater<int>()) //排序结果:6 5 4 3 2 1 }
//大部分情况下用greater<type>和less<type>,但是比较的是点的坐标的话就要使用自定义比较函数了 struct Point { int x; int y; }; bool Mycmp(Point a,Point b) //先降序排序点的横坐标,横坐标相同的所有点中降序排序点的纵坐标 { if(a.x!=b.x) return a.x>b.x; else return a.y>b.y; } int main() { Point arr[1005]; for(int i=0;i<5;i++) cin>>arr[i].x>>arr[i].y; sort(arr,arr+5,Mycmp); for(int i=0;i<5;i++) cout<<arr[i].x<<" "<<arr[i].y<<endl; }
测试案例
2.其他algorithm函数
简单的6个函数
vector<int>v; min_element(v.begin(),v.end()) //返回第一个元素的指针 O(n) max_element(v.begin(),v.end()) //返回最后一个元素的指针 O(n) //这两个函数都是默认升序排序的,不要被 min 和 max 迷惑了 //以上两个函数都可以sort的变形,可以添加第三个参数 //即 greater<type> , less<type> , 自定义函数调整排序顺序 min(a,b); //返回a,b中较小的那个数 max(a,b); //返回a,b中较大的那个数 swap(v[0],v[1]); //交换任意两个同类型变量 O(1) reverse(v.begin(),v.end()); //将数组翻转 O(n)
nth_element()
函数
vector<int>v={2,5,6,1,3,4}; nth_element(v.begin(),v.begin()+3,v.end()); //把数组第n小(从0开始算)的数放到第n个位置 //可以理解为快排的简化版,并且左边的数都比它小,右边的数都比它大 //O(n), sort的复杂度是O(nlogn),必要时刻还是要用这个函数的 //排序结果:2 1 3 4 6 5 //第三号也就是第四个数是4
unique()
函数
vector<int>v={2,5,6,1,3,4,5,5}; sort(v.begin(),v.end()); //排序结果: 1 2 3 4 5 5 5 6 auto it=unique(v.begin(),v.end()); //排序结果 1 2 3 4 5 6 5 5 //使用unique前需要将数组排序 //unique的作用是将多余的数字放在数组的末尾 //返回的是一个数组末尾指针 所以*it=5 //O(n) int NewSize=unique(v.begin(),v.end())-v.begin(); //NewSize=6 //这是一种去重的方法,和set容器达成的效果一样 //数组里面的也只有 1 2 3 4 5 6这六个数字
binary_search()
函数
bool IsEx=binary_search(v.begin(),v.end(),1); //前提排好序 //判断对应元素是否存在 O(logn)
lower_bound
函数和upper_bound
函数
vector<int>v={1,2,3,4,5,6}; auto pos=lower_bound(v.begin(),v.end(),3); //前提排好序 //从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字 //找到返回该数字的地址,不存在则返回end //O(logn) auto pos=upper_bound(v.begin(),v.end(),3); //前提排好序 //从数组的begin位置到end-1位置二分查找第一个大于(没有等于)num的数字 //找到返回该数字的地址,不存在则返回end //O(logn)
这篇关于算法初步——C++标准库的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24怎么切换 Git 项目的远程仓库地址?-icode9专业技术文章分享
- 2024-12-24怎么更改 Git 远程仓库的名称?-icode9专业技术文章分享
- 2024-12-24更改 Git 本地分支关联的远程分支是什么命令?-icode9专业技术文章分享
- 2024-12-24uniapp 连接之后会被立马断开是什么原因?-icode9专业技术文章分享
- 2024-12-24cdn 路径可以指定规则映射吗?-icode9专业技术文章分享
- 2024-12-24CAP:Serverless?+AI?让应用开发更简单
- 2024-12-23新能源车企如何通过CRM工具优化客户关系管理,增强客户忠诚度与品牌影响力
- 2024-12-23原创tauri2.1+vite6.0+rust+arco客户端os平台系统|tauri2+rust桌面os管理
- 2024-12-23DevExpress 怎么实现右键菜单(Context Menu)显示中文?-icode9专业技术文章分享
- 2024-12-22怎么通过控制台去看我的页面渲染的内容在哪个文件中呢-icode9专业技术文章分享