1. 集合論簡(jiǎn)介
集合論,是數(shù)學(xué)的一個(gè)基本的分支學(xué)科,研究對(duì)象是一般集合。集合論在數(shù)學(xué)中占有一個(gè)獨(dú)特的地位,它的基本概念已滲透到數(shù)學(xué)的所有領(lǐng)域。集合論或集論是研究集合(由一堆抽象物件構(gòu)成的整體)的數(shù)學(xué)理論,包含了集合、元素和成員關(guān)系等最基本的數(shù)學(xué)概念。
在我們還在高中教育階段,可能或多或少會(huì)接觸到一些諸如集合并交差的運(yùn)算,而集合論與我們C++的STL運(yùn)算有很多相似而相同的關(guān)系。
2. 集合關(guān)系
我們假設(shè)有兩個(gè)集合:
A={2,4,6}
B={1,2,3,4,5}
在數(shù)學(xué)上
交運(yùn)算可以寫為:
并運(yùn)算可以寫為:
差運(yùn)算可以寫為:
我們以該內(nèi)容為例,進(jìn)行代碼介紹。
3. Algorithm頭文件
STL的算法頭文件,STL中除了我們常用的這些容器文件以外,還有一個(gè)極其重要的頭文件,Algorithm,他是我們常用的標(biāo)準(zhǔn)算法的集合,為我們預(yù)先封裝了我們可能會(huì)用到的算法,比如說(shuō)排序,使用Algorithm頭文件中的sort函數(shù)可以快速幫我們進(jìn)行數(shù)組排序,以下是實(shí)例代碼:
#include<iostream> #include<algorithm> using namespace std; int main(){ int a[6]={1,5,9,4,6,3}; sort(a,a+6); //使用STL的快速排序算法 for(int i=0;i<6;i++){ cout<<a[i]<<' '; } }
4. 集合論與STL集合
在數(shù)學(xué)上的并運(yùn)算我們可以使用set_union()函數(shù)進(jìn)行實(shí)現(xiàn),而交運(yùn)算我們也可以使用set_intersection()函數(shù)進(jìn)行實(shí)現(xiàn),差集則使用set_difference()函數(shù)實(shí)現(xiàn),以下是簡(jiǎn)單的實(shí)現(xiàn)代碼,這個(gè)案例會(huì)同時(shí)提供一些前面所學(xué)的知識(shí),當(dāng)作一個(gè)匯總練習(xí)。
#include <iostream> #include <set> #include <vector> #include <algorithm> //使用算法頭文件 using namespace std; int main(){ set<int> a, b; //建立兩個(gè)集合 vector<int> c; //建立一個(gè)向量,我們用這個(gè)向量存儲(chǔ)運(yùn)算結(jié)果 //a = {2,4,6}; a.insert(2); a.insert(4); a.insert(6); //b = {1,2,3,4,5}; b.insert(1); b.insert(2); b.insert(3); b.insert(4); b.insert(5); set_union(a.begin(), a.end(), b.begin(), b.end(), back_inserter(c));//并集 for(vector<int>::iterator it=c.begin();it!=c.end();it++){ cout<< *it << ' '; } cout<<endl; c.clear(); set_intersection(a.begin(), a.end(), b.begin(), b.end(), back_inserter(c));//交集 for(vector<int>::iterator it=c.begin();it!=c.end();it++){ cout<< *it << ' '; } cout<<endl; c.clear(); set_difference(a.begin(), a.end(), b.begin(), b.end(), back_inserter(c)); //差集 從B中減去A包含的元素 for(vector<int>::iterator it=c.begin();it!=c.end();it++){ cout<< *it << ' '; } cout<<endl; c.clear(); return 0; }
可以見(jiàn)的,以上的三個(gè)函數(shù),其使用方法均是第一個(gè)集合開(kāi)始到結(jié)束,第二個(gè)集合開(kāi)始到結(jié)束,然后使用back_inserter插入器將數(shù)據(jù)插入到某一個(gè)向量或者其他容器之中,并交差是我們集合運(yùn)算中的最基本的運(yùn)算,有了這幾種運(yùn)算,我們可以構(gòu)建出非常多的集合論中的各種功能,以達(dá)到我們的數(shù)學(xué)功能。
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫出一個(gè)爬蟲(chóng)的Python編程課程
只會(huì)語(yǔ)法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程