c++常用小算法

这篇文章列出了一些简单常用的C++容器算法,C++标准库中事实上提供了很多的算法并且有详细的介绍。如果需要详细的了解这些算法可以 参考C++在线参考手册 algrithm .

1 排序

#include<algorithm> 中,调用形式为 sort(beign,end) 它的参数为一个输入区间。注意end要指向需要排序的最后一个 元素的下一个位置。参数可以是指针也可以是迭代器。

int num[10]={1,3,5,7,9,0,2,4,6,8};
sort(num,num+10);

去除重复元素

一般需要unique函数(#include<algorithm>)和sort函数共同使用。unique函数实际上是一种伪去除函数, 它可以将容器中相邻的重复元素放到容器的末尾,然后返回第一个重复元素的地址。由于重复元素相邻才能放到末尾 所以需要使用sort先进行排序。下面这个例子用来去除vector中重复的元素。

#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main()
{
    vector<int> vec;
    vector<int>::iterator iter;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    vec.push_back(4);
 
    sort(vec.begin(),vec.end());
	for(vector<int>::iterator i =vec.begin();i != vec.end();++i)
	{
		cout<<*i<<" ";
	}
	cout<<endl;
    iter = unique(vec.begin(),vec.end());
	vec.erase(iter,vec.end());
    for(iter=vec.begin(); iter!=vec.end(); ++iter)
        cout<<*iter<<" ";
        cout<<endl;
 
    return 0;
}

3 找到vector中最大值和最小值

#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main()
{
	vector<int> vec(5);	//5行
 
	int i = 0;
	for(vector<int >::iterator ite=vec.begin();ite != vec.end();++ite)
	{
		*ite = i;
		i++;
	}
  //vector<int>::iterator maxIte = max_element(vec.begin(),vec.end());
  //cout<<*maxIte<<endl;
	auto maxMin = minmax_element(vec.begin(),vec.end());
	cout<<*maxMin.first<<","<<*maxMin.second<<endl;
 
    return 0;
}

4 利用map比较函数进行排序

利用map在插入键值对时会自动排序,我们可以灵活的实现对数据的各种排序要求。如排序并获得排序前对应的角标索引, 不排序获得排序后的名次。下面是使用map获得排序名次的一个示例:

#include <iostream>
#include <vector>
#include <map>
 
using namespace std;
 
class a
{
	public:
	struct strA
	{
		double d;
		int I;
	};
};
 
int main()
{
	vector<a::strA> a;
	a.resize(5);
	a[0].d = 2;
	a[1].d = 3;
	a[2].d = 0;
	a[3].d = -1;
	a[4].d = 8.4;
	map<double,int> temp;
	for(int i = 0;i < a.size();++i)
		temp.insert(make_pair(a[i].d,i));	//数据放入map中会自动按键值升序排序
	int i = a.size();
	for(map<double,int>::iterator it = temp.begin();it != temp.end();++it)
	{
		a[it->second].I = i;
		i--;
	}
	for(int i = 0;i < a.size();++i)
		cout<<a[i].d<<","<<a[i].I<<endl;
 
    return 0;
}

执行结果:

2,3
3,2
0,4
-1,5
8.4,1

前面是需要排序的数( strA.d ),后面是对应的排序名次( strA.i )。 实际上map的比较函数是可以自定义的,利用这一点我们可以更灵活的进行排序。

时间: 2024-08-01 12:42:07

c++常用小算法的相关文章

常用小算法

1.快速模取幂 要求 a^b % c的时候,当然可以直接循环然后每一步都mod c,这样的复杂度就是O(b)了,但是快速模取幂算法可以降低复杂度. 描述如下: 数论计算中经常出现的一种运算就是求一个数的幂ab对另外一个数n个模的运算,即计算: ab mod n (a,b,n是正整数) 由于计算机只能表示有限位的整数,所以编程时模取幂的运算要注意值的大小范围,当ab的值超过整数范围时,mod运算便无法进行. 如何解决这个问题,我们引出一个能计算ab mod n的值的有用算法——反复平方法,首先我们

常用的算法思想总结

对于计算机科学而言,算法是一个非常重要的概念.它是程序设计的灵魂,是将实际问题同解决该问题的计算机程序建立起联系的桥梁.接下来,我们来看看一些常用的算法思想. (一)穷举法思想 穷举法,又称为强力法.它是一种最为直接,实现最为简单,同时又最为耗时的一种解决实际问题的算法思想. 基本思想:在可能的解空间中穷举出每一种可能的解,并对每一个可能解进行判断,从中得到问题的答案. 使用穷举法思想解决实际问题,最关键的步骤是划定问题的解空间,并在该解空间中一一枚举每一个可能的解.这里有两点需要注意,一是解空

DotNet常用排序算法总结

数据结构和算法对一个程序来说是至关重要的,现在介绍一下几种算法,在项目中较为常用的算法有:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等7中算法. 现在介绍选择排序算法,希尔排序算法,快速排序算法. (1).选择排序算法:通过n-i次关键字间的比较,从n-i+1个记录中选择出关键字最小的记录,并和第i(1大于等于i小于等于n)个记录交换. (2).希尔排序:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组.所有距离为d1的倍数的记录放在同一个组中.先在各

特殊的日子(2015年5月1日劳动节)纪念回归和新的征程,用LRU和LFU两个小算法原理和区别来抛砖引玉

很久没有写过新的博客了,原因有很多,冠冕堂皇的理由就是工作忙,生活忙,各种累,直白一点其实就是变懒了,所以没有写. 在沉寂了这么长一段时间过后,终于又要重新出发了,对于自己当前的状态,觉得首先要有所沉淀,然后就是要放空自己,唯有放空自己方能继续进步. 以后一段时间更新的博客内容主体是与Android Framework相关的疑难问题分析.机制实现的原理.源代码调用分析,然后伴有一些常用的小算法,语言特性,程序原理等. 今天就先介绍LRU和LFU这两个在Android的Framework以及App

Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]

常用推荐系统算法总结

一,常用推荐系统算法总结 1.Itemcf (基于商品的协同过滤) 这个算法是cf中的一种,也是当今很多大型网站都在采用的核心算法之一.对于商城网站(以Amazon为代表,当然也包括京东那种具有搞笑特色的推荐系统在内),影视类推荐,图书类推荐,音乐类推荐系统来说,item的增长速度远不如user的增长速度,而且item之间的相似性远不如user之间的相似性那么敏感,所以可以在离线系统中将item的相似度矩阵计算好,以供线上可以近乎即时地进行推荐.因为这种方法靠的是item之间的相关性进行推荐,所

常用排序算法比较与分析

一.常用排序算法简述 下面主要从排序算法的基本概念.原理出发,分别从算法的时间复杂度.空间复杂度.算法的稳定性和速度等方面进行分析比较.依据待排序的问题大小(记录数量 n)的不同,排序过程中需要的存储器空间也不同,由此将排序算法分为两大类:[内排序].[外排序]. 内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中. 外排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中还需要对外存进行访问的排序过程. 先了解一下常见排序算法的分类关系(见图1-1) 图1-1 常见排

七种常用排序算法

七种常用排序算法 一.常见排序算法一览: 时间复杂度: 是一个函数,它定量描述了该算法的运行时间. 空间复杂度:一个算法在运行过程中临时占用存储空间大小的量度. 稳定性:保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同就稳定,反之不稳定. 视觉直观感受 7 种常用的排序算法 二.算法C#实现: 1. 直接插入排序: using System; using System.Collections.Generic; using System.Linq; using Sys

常用排序算法之——快速排序

快速排序的原理: 首先找一个标兵值,等于某一个元素值:遍历数组,将数组分为小于标兵值和大于标兵值的两部分:然后分别对两个部分采用快速排序,递归. 分开数组时,维持一个指针,指向已找到小部分的最后一个元素:一个指针用于遍历. 不稳定排序算法.当数组已经有序时,时间复杂度最差,为O(N2),平均.最优情况下都为O(N lgN). 代码如下: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T> 5 v