STL — set容器的使用详解

古城微笑少年丶 2022-06-06 10:12 398阅读 0赞

set容器的使用详解

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

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

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

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

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

值,关系到set元素的排列规则,如果任意改变set元素值,会严重破坏set组织. set的源代码之中看到,set::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作为示范.

插入操作:

#

  1. set<int> T;
  2. //***1*** 最普通的插入方式
  3. T.insert(2);
  4. T.insert(3);
  5. T.insert(4);
  6. T.insert(5);
  7. T.insert(6);
  8. //插入元素
  9. cout << "遍历T的元素: " << " ";
  10. set<int>::iterator it1 = T.begin();
  11. while (it1 != T.end())
  12. {
  13. cout << *it1 << " ";
  14. ++it1;
  15. }
  16. cout << endl;
  17. //***2*** 利用数组集合插入
  18. set<int> OtherSet;
  19. int arr[10] = { 1, 2, 3, 4, 5 };
  20. OtherSet.insert(arr, arr + 3);
  21. cout << "遍历OtherSet的元素: " << " ";
  22. it1 = OtherSet.begin();
  23. while (it1 != OtherSet.end())
  24. {
  25. cout << *it1 << " ";
  26. ++it1;
  27. }
  28. cout << endl;
  29. //***3*** 利用迭代器区间进行插入
  30. set<int> OtherSet2;
  31. OtherSet2.insert(T.begin(), T.end());
  32. cout << "遍历OtherSet的元素: " << " ";
  33. it1 = OtherSet2.begin();
  34. while (it1 != OtherSet2.end())
  35. {
  36. cout << *it1 << " ";
  37. ++it1;
  38. }
  39. cout << endl;

运行结果:

20171106164453001

#

删除操作:

代码演示:

  1. set<int> T;
  2. int arr[10] = { 1, 2, 3, 4, 6, 7 };
  3. T.insert(arr, arr + 6);
  4. cout << "遍历T的元素: " << " ";
  5. set<int>::iterator it1 = T.begin();
  6. while (it1 != T.end())
  7. {
  8. cout << *it1 << " ";
  9. ++it1;
  10. }
  11. cout << endl;
  12. //***1*** 找到节点迭代器然后删除节点
  13. set<int>::iterator it2 = T.find(2);
  14. //先找到键值为2的迭代器,然后删除该迭代器.
  15. T.erase(it2);
  16. cout << "遍历T的元素: " << " ";
  17. it1 = T.begin();
  18. while (it1 != T.end())
  19. {
  20. cout << *it1 << " ";
  21. ++it1;
  22. }
  23. cout << endl;
  24. //***2*** 删除一个迭代器区间
  25. it2 = T.find(3);
  26. T.erase(it2, T.end());
  27. //删除3到set结束这段区间的所有元素.
  28. cout << "遍历T的元素: " << " ";
  29. it1 = T.begin();
  30. while (it1 != T.end())
  31. {
  32. cout << *it1 << " ";
  33. ++it1;
  34. }
  35. cout << endl;
  36. //***3*** 终极大招 clear
  37. T.clear();
  38. cout << "遍历T的元素: " << " ";
  39. it1 = T.begin();
  40. while (it1 != T.end())
  41. {
  42. cout << *it1 << " ";
  43. ++it1;
  44. }
  45. cout << endl;

运行结果:

20171106165106979

发表评论

表情:
评论列表 (有 0 条评论,398人围观)

还没有评论,来说两句吧...

相关阅读

    相关 c++ stl之关联式容器 set

    关联式容器 1.什么是关联式容器 关联式容器依据特定的排序法则,自动对容器内的数据元素进行排序。排序的准则是以函数的形式呈现出来的,用来比较数据元素的值(value)或者键