您的位置:首页 > 其它

set和map的增删查改

2018-04-02 20:20 99 查看
一,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与要查找的值相等的元素,返回对应的迭代器





相同点:底层都是使用红黑树构造的,这使得它们的查找,插入,删除的效率都非常高,并且它们都是有序的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  set map