set和map的增刪查改
一,set用法介紹:
set是單詞set(集合)的意思
只有一個鍵值,set當中不能儲存相同的鍵值
所有的元素都會根據元素的鍵值自動被排序。(底層檢索使用中序遍歷演算法)
相關函式:
(1)begin:返回一個迭代器,此迭代器指向set中到的第一個元素。
(2)end:返回一個迭代器,此迭代器指向set最後一個元素的下一個位置。
(3)rbegin:返回一個迭代器,此迭代器指向反向set中的第一個元素。
(4)rend:返回一個迭代器,此迭代器指向反向set中最後一個元素之後的位置。
(5)cbegin:返回一個常量迭代器,此迭代器指向set中到的第一個元素。
(6)cend:返回一個迭代器,此迭代器指向set最後一個元素的下一個位置。 (7)clear:清除set的所有元素。
(8)crbegin:返回一個常量迭代器,此迭代器指向反向set中的第一個元素。
(9)crend:返回一個常量迭代器,此迭代器指向反向set中最後一個元素之後的位置。
(10)find:返回一個迭代器,此迭代器指向set中其鍵與指定鍵相等到的元素的位置。
(11)insert:將元素或元素範圍插入到set中的指定位置。 (12)size:返回set中元素的數量。
(13)swap:交換兩個set的元素。
(1)插入(正向遍歷):
採用insert()方法把元素插入到集合中,一般按元素值從小到大插入。使用前向迭代器對集合中序遍歷,結果正好是元素排序後的結果。
#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int> s;//建立set集合物件
s.insert(5);
s.insert(1);
s.insert(6);
s.insert(3);
s.insert(5);//重複插入5,會失效
set<int >::iterator it;//定義前向迭代器
for(it = s.begin();it!=s.end();it++)
{
cout<<* it<<" ";
}
cout<<endl;
return 0;
}
輸出:1 3 5 6
(2)反向遍歷:
使用反向迭代器reverse_iterator可以反向遍歷集合,輸出的結果正好是集合元素的反向排序結果。它需要用到rbegin()和rend()兩個方法,它們分別給出了反向遍歷的開始位置和結束位置。
#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int> s;//建立set集合物件
s.insert(5);
s.insert(1);
s.insert(6);
s.insert(3);
s.insert(5);//重複插入5,會失效
set<int>::reverse_iterator rit;//定義反向迭代器
for(rit = s.rbegin();rit!=s.rend();rit++)
{
cout<<* rit<<" ";
}
cout<<endl;
return 0;
}
輸出:6 5 3 1
(3)刪除:
int main()
{
set<int> T;
int arr[10]={1,2,3,4,5,6,7};
T.insert(arr,arr+6);
cout<<"遍歷T:"<<" ";
set<int>::iterator it1 = T.begin();
while(it1 != T.end())
{
cout<< *it1<<" ";
++it1;
}
cout<<endl;
//(1)刪除一個節點,找到鍵值為2的迭代器
set<int>::iterator it2 = T.find(2);
//然後刪除該節點
T.erase(it2);
cout<<"刪除節點2:"<<" ";
it1=T.begin();
while(it1 != T.end())
{
cout<< *it1<<" ";
++it1;
}
cout<<endl;
//(2)刪除一個迭代器區間
it2 = T.find(3);
T.erase(it2,T.end());
cout<<"刪除3後面的節點"<<" ";
it1 = T.begin();
while(it1 != T.end())
{
cout<< *it1<<" ";
++it1;
}
cout<<endl;
//(3)刪除set的所有元素
T.clear();
cout<<"刪除所有元素:"<<" ";
it1 = T.begin();
while(it1 != T.end())
{
cout<< *it1<<" ";
++it1;
}
cout<<endl;
}
(4)查詢:
使用find()方法對集合進行檢索,如果找到查詢的鍵值,返回該鍵值的迭代器位置,否則返回集合最後一個元素後面的一個位置,即end()。
int main()
{
set<int> T;
int arr[10]={1,2,3,4,5,6,7};
T.insert(arr,arr+6);
set<int>::iterator it;
it = T.find(6); //查詢鍵值為6的元素
if(it != T.end())
cout << *it << endl;
else
cout << "not find it" << endl;
it = T.find(20); //查詢鍵值為20的元素
if(it != T.end())
cout << *it << endl;
else
cout << "not find it" << endl;
return 0;
}
map用法介紹:
Map是單詞mapping(對映)的縮寫
(1)內部儲存有兩個部分,一個是固定的鍵值,另一個關鍵字是記錄該關鍵字的狀態(大小,翻譯,對應關係等)
(2)由於map容器底層是使用搜索樹來儲存資料的,所以只要資料不能夠相互比較大小就不能使用map儲存。
相關函式
(1)begin:返回一個迭代器,此迭代器指向對映中的第一個元素 (2)end::返回超過迭代器末尾
(3)rbegin:返回一個迭代器,此迭代器指向反向對映中的第一個元素
(4)rend:返回一個迭代器,此迭代器指向反向對映中的最後一個元素之後的位置。
(5)cbegin:返回一個常量迭代器,此迭代器指向對映中的第一個元素。 (6)cend:返回一個超過末尾的常量迭代器。
(7)crbegin:返回一個常量迭代器,此迭代器指向反向對映中的第一個元素。
(8)crend:返回一個常量迭代器,此迭代器指向反向對映中最後一個元素之後的位置。 (9)empty:如果對映為空,則返回true。
(10)size:返回對映中的元素數量。 (11)max_size:返回對映的最大長度。 (12)at:查詢具有指定鍵值的元素。(13)earse:從指定位置移除對映中的元素或元素範圍。
(14)find:返回一個迭代器,此迭代器指向對映中其鍵值與指定鍵相等的元素的位置。 (15)swap:交換兩個對映的元素。
(16)clear:清除對映的所有元素。
(17)lower_bound:返回一個迭代器,此迭代器指向對映中其鍵值等於或大於指定鍵值的第一個元素。
(18)upper_bound:返回一個迭代器,此迭代器指向對映中其鍵值大於指定鍵值的第一個元素。
(1)訪問:
int main()
{
map<int,int> T;
T[0] = 1;
T[1] = 2;
T[2] = 3;
T[3] = 4;
//cout<<"鍵值為2的元素:"<<endl;
//cout<<T.at(2)<<endl;//c++11不支援
cout<<"依次遍歷"<<endl;
map<int,int>::iterator it=T.begin();//map中第一個元素位置的迭代器
while(it!=T.end())
{
cout<<it->first<<"->"<<it->second<<endl;
++it;
}
cout<<"find一個元素的迭代器並且訪問它:"<<endl;
cout<<T.find(3)->first<<"->"<<T.find(3)->second<<endl;
}
(2)插入:
(a)單個元素的插入:
pair<iterator,bool>insert(const value_type&v)
將元素v(包括鍵值和映照資料)插入map容器,重複的v值不被插入。返回一個pair配對物件。
pair說明:是一個結構體型別,裡面的兩個成員變數的型別可以通過模板給定,在這裡如果插入成功新元素,則pair中的第二個元素為bool,反之為false。
(b)給定迭代器位置插入:
iterator insert(iterator position,const value type& v)
將元素v(包括鍵值和映照資料)插入map容器,引數position只是提示可在position位置之前插入v,所以返回的插入位置視情況而定,你一定在position位置前插入。
(c)給定迭代器位置插入:
void insert(InputIterator first,InputIterator last)
將迭代器區間[first,last)所指的資料作為容器元素(包括鍵值和對映資料),插入到map容器中。
(3)刪除:
(a)刪除給定迭代器位置的元素
用erase() 刪除一個元素,傳入刪除元素的迭代器
void erase(iterator opsition);
(b)給定K值,進行刪除
size_type erase(const key_type& k);
(c)刪除給定範圍的資料
void erase(iterator first,iterator last);
(4)查詢:
查詢map中key與要查詢的值相等的元素,返回對應的迭代器
相同點:底層都是使用紅黑樹構造的,這使得它們的查詢,插入,刪除的效率都非常高,並且它們都是有序的