首页 > 代码库 > c++常用小算法

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的比较函数是可以自定义的,利用这一点我们可以更灵活的进行排序。

c++常用小算法