分享

STL--set容器的使用详解 插入、删除

 木三水0vosidma 2019-05-06

set容器的使用详解

其实map和set是一个爸爸 - 红黑树爸爸,只不过set力气不够,不像map那么可以拥有一个主键(key)和实键(value).它只有一个键值并且


set当中不能存储相同的键值(set还具有强迫症). 其实map和set的区别差不多就完了. 他们的相同点,他们底层都是使用红黑树构造的


这使得他们的查找,插入,删除的效率都非常的高. 并且他们都是有序的,这些都非常关键! 这是一个好的容器的标准.当然set的禁忌


也和map一样,set不能存储无法比较大小的数据. 因为构建红黑树需要比较大小. 而且在set中存储相同的键值 ,新的就会覆盖久的.


set的特性是,所有元素都会根据元素的键值自动被排序. 我们可以通过set的迭代器改变set的元素值吗? 不行,因为set元素值就是其键


值,关系到set元素的排列规则,如果任意改变set元素值,会严重破坏set组织. set的源代码之中看到,set<T>::iterator被定义为底层RB_


tree的const_iterator,杜绝写入操作. 换句话说,set iterator是一种constant iterator(相对于mutable iterator).


set拥有与list相同的某些性质: 当客户端对它进行元素新增操作或删除操作时,操作之前的所有迭代器,在操作完成之后都依然有效,当然


那个被删除元素迭代器必然是个例外.



set相关函数



 

begin 返回一个迭代器,此迭代器指向set中的第一个元素。

cbegin 返回一个常量迭代器,此迭代器指向set中的第一个元素。

cend 返回一个迭代器,此迭代器指向set最后一个元素的下一个位置

clear 清除set的所有元素。

crbegin 返回一个常量迭代器,此迭代器指向反向set中的第一个元素。

crbegin 返回一个常量迭代器,此迭代器指向反向set中的第一个元素。

crend 返回一个常量迭代器,此迭代器指向反向set中最后一个元素之后的位置。

emplace 将就地构造的元素插入到set。

emplace_hint 将就地构造的元素插入到set,附带位置提示。

empty 如果set为空,则返回 true。

end 返回一个迭代器,此迭代器指向set最后一个元素的下一个位置

erase 从指定位置移除set中的元素或元素范围。

   

find 返回一个迭代器,此迭代器指向set中其键与指定键相等的元素的位置。

get_allocator 返回集合中与给定值相等的上下限的两个迭代器.

insert 将元素或元素范围插入到set中的指定位置。

key_comp 将返回一个用于元素键值比较的函数

lower_bound 返回一个迭代器,此迭代器指向set中其键值等于或大于指定键的键值的第一个元素。

max_size 返回set的最大长度。

rbegin 返回一个迭代器,此迭代器指向反向set中的第一个元素。

rend 返回一个迭代器,此迭代器指向反向set中最后一个元素之后的位置。

size 返回set中的元素数量。

swap 交换两个set的元素。

upper_bound 返回一个迭代器,此迭代器指向set中其键值大于指定键的键值的第一个元素。

   

   

   


访问操作:


这里我们需要掌握的函数有:begin,end,find,cbegin,cend.rbegin,rend,empty 


因为这里的rbegin,rend,cbegin.cend用法和begin和end用法相同,所以我们这里使用begin作为示范.


插入操作:


 set<int> T;

 

 

 //***1*** 最普通的插入方式

 T.insert(2);

 T.insert(3);

 T.insert(4);

 T.insert(5);

 T.insert(6);

 //插入元素

 

 cout << "遍历T的元素: " << " ";

 set<int>::iterator it1 = T.begin();

 

 while (it1 != T.end())

 {

  cout << *it1 << " ";

  ++it1;

 }

 cout << endl;

 

 //***2*** 利用数组集合插入

 set<int> OtherSet;

 int arr[10] = { 1, 2, 3, 4, 5 };

 OtherSet.insert(arr, arr + 3);

 

 cout << "遍历OtherSet的元素: " << " ";

 it1 = OtherSet.begin();

 

 while (it1 != OtherSet.end())

 

 {

  cout << *it1 << " ";

  ++it1;

 }

 cout << endl;

 

 //***3*** 利用迭代器区间进行插入

 

 set<int> OtherSet2;

 

 OtherSet2.insert(T.begin(), T.end());

 

 cout << "遍历OtherSet的元素: " << " ";

 it1 = OtherSet2.begin();

 

 while (it1 != OtherSet2.end())

 

 {

  cout << *it1 << " ";

  ++it1;

 }

 cout << endl;



运行结果:




删除操作:



代码演示:


 set<int> T;

 int arr[10] = { 1, 2, 3, 4, 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*** 找到节点迭代器然后删除节点

 

 set<int>::iterator it2 = T.find(2);

 //先找到键值为2的迭代器,然后删除该迭代器.

 

 T.erase(it2);

 

 cout << "遍历T的元素: " << " ";

 it1 = T.begin();

 

 while (it1 != T.end())

 

 {

  cout << *it1 << " ";

  ++it1;

 }

 cout << endl;

 

 //***2*** 删除一个迭代器区间

 it2 = T.find(3);

 

 T.erase(it2, T.end());

 //删除3到set结束这段区间的所有元素.

 

 cout << "遍历T的元素: " << " ";

 it1 = T.begin();

 

 while (it1 != T.end())

 

 {

  cout << *it1 << " ";

  ++it1;

 }

 cout << endl;

 

 //***3*** 终极大招 clear

 

 T.clear();

 

 cout << "遍历T的元素: " << " ";

 it1 = T.begin();

 

 while (it1 != T.end())

 

 {

  cout << *it1 << " ";

  ++it1;

 }

 cout << endl;


运行结果:








    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多