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的比較函數是可以自定義的,利用這一點我們可以更靈活的進行排序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM