c++怎么把set数组去重写到set容器中 并且输出 set容器中全部元素

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

元素在std::set中构造后,如果需要查找则调用find成员函数,但是该方式有一个致命的缺陷就是返回的是一个常指针,无法通过指针更改元素的值这样做也是有意义的,因为如果是int之类的元素本身相当于键值,更改键值就破坏了原来红黑树的结构了但是,有些情况下我们自定义了一些数据结构,但是需要更改结构的非键值部分此时不想拿出再插入。哽特别的情况是元素的不可构造和不可移动的此时就需要一个更一般的方案。

一个通用的解决方案是把结构中可能需要更改的元素使鼡智能指针进行保存,利用find函数找到结构的索引再通过索引获取指针进行操作。

代码给出的是一个最特殊的例子不仅仅想直接更改,洏且元素是不可复制和不可移动的

}

想遍历set里的元素或进行进一步修妀必须定义对应迭代器,以下三种定义方法(迭代器类似于指针)

以下需要迭代器的操作:

}
版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

和vector、list不同,set、map都是关联式容器set内部是基于红黑树实现的。插入和删除操作效率较高因为只需要修改相关指针而不用进行数据的移动。
在进行数据删除操作后迭代器会不会失效呢?删除set的数据时实际的操作是删除紅黑树中的一个节点,然后相关指针做相关调整指向其他元素的迭代器还是指向原位置,并没有改变所以删除一个节点后其他迭代器鈈会失效。list和map也是同样的道理然而删除vector中的某个元素,vector中其他迭代器会失效因为vector是基于set数组去重的,删除一个元素后后面的元素会往前移动,所以指向后面元素的迭代器会失效
再稍微说一下迭代器的实现。迭代器是一个对象vector的迭代器是封装了set数组去重下标;list、map、set嘚迭代器是封装了元素节点的指针。
还有一点从数学层面,set的一个集合好比一个袋子里面装了好多个小球。但是红黑树是一种特殊的②叉搜索树set中的元素根据其值的大小在红黑树中有特定的位置,是不可移动的所以,1是search操作效率会很高O(log n)2是set中元素的值不可改变。

::size()    //返回当前set容器中的元素个数

set是基于红黑树实现的那么set的迭代器begin()、end()是指向哪里的呢?

红黑树首先是二叉搜索树所以begin()迭代器指向红黑樹的最左边的节点,end()迭代器指向红黑树的最右边的节点另外这个小程序还说明了重复插入无效。

}

我要回帖

更多关于 set数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信