std::set 中内部元素有序条件删除的理解

1. std::set中的元素是有序排列的

  注意:Set集合中的元素通过iterator的引用,但是不能修改。

元素排序:

(1)元素中实现比较operator < ,

(2)Set构造中,输入仿函数(实现元素比较排序)

  基于上述的规则,因此:如果要更新Set中元素的修改,只能将元素erase删除,然后将更新后的元素insert中,则自动保证insert中的相应位置

  

2. 如果Set中的元素是object,不是指针。

  删除元素的代码:

  因为, 如果用iterator删除当前所指的元素,只能用s.erase(it++) 这样的形势, 在it删除之后,其实已经更新为下一个的迭代器了。

#include <set>
using std::set; int main(int argc,char *argv[])
{
set<int> s;
set<int>::iterator it; s.insert();
s.insert();
s.insert(); for(it=s.begin();it!=s.end();){
if((*it)%==)
s.erase(it++);
else
it++
;
} system("pause"); return ;
} STL/C++__中 set(集合)  删除元素, set的erase不会返回迭代器,这点需要注意。

3. 如果Set中的元素是:指针。

  因为元素是指针,因此同样要要提供:比较函数。

  这样可以突破了:虽然不能修改元素内容,因为元素指针不能修改,但是元素指针所指的内存可以修改。但是注意:此时的“顺序”不能保证

  注意,在Set中,插入指针类型,如果释放资源,可以直接delete (*it), 注意, 此时的it还是有效的,可以使用it++

#include "stdafx.h"
#include <set> #include <iostream>
using namespace std; class Name
{
public:
Name(int _a, int _b) :a(_a), b(_b){};
int a;
int b;
}; class CMP
{
public: bool operator()(Name* _p1, Name* _p2)
{
if (_p1->a < _p2->a)
return true;//前一个元素,小于,后一个元素,升序
return false; }
};
typedef std::set<Name*, CMP> ContainerType; int _tmain(int argc, _TCHAR* argv[])
{
ContainerType container;
container.insert(new Name(, ));
container.insert(new Name(, ));
container.insert(new Name(, ));
container.insert(new Name(, ));
container.insert(new Name(, ));
container.insert(new Name(, )); ContainerType::iterator it;
//显示
for (it = container.begin(); it != container.end(); ++it)
{
//更新内部状态
cout << (*it)->a << " " << (*it)->b << endl;
} cout << "---------------------" << endl; for (it = container.begin(); it != container.end(); ++it)
{
//更新内部状态
if ((*it)->a > )
(*it)->a -= ;
else
{
(*it)->a += ;
} }
container.insert(new Name(, ));
container.insert(new Name(, ));
//显示
for (it = container.begin(); it != container.end(); ++it)
{
//更新内部状态
cout << (*it)->a << " " << (*it)->b << endl;
} //释放资源
for (it = container.begin(); it != container.end(); ++it)
{
//更新内部状态
delete *it;
} system("pause");
return ;
}

  

   

endl;

std::set 中内部元素有序条件删除的理解的更多相关文章

  1. 删除 list 集合中的元素

    删除 list 集合中的元素,当删除的元素有多个的时候,只能使用迭代器来删除. 当删除 list 集合中的元素只有一个的时候,有三种方法都可以实现. import java.util.ArrayLis ...

  2. Java根据条件删除Map中元素

    今天在写程序过程中,需要根据判断条件删除一个Map中的相应数据,我自然而然想到可以通过调用Map中的remove(Object key)函数进行删除:代码如下: public Map<Doubl ...

  3. Map中根据条件删除元素

    今天在写程序过程中,需要根据判断条件删除一个Map中的相应数据,我自然而然想到可以通过调用Map中的remove(Object key)函数进行删除:代码如下: public Map<Doubl ...

  4. vector中的元素删除

    删除vector中的元素,最容易的方法就是使用vector的erase()函数. vector vec;for ( vector::iterator iter = vec.begin(); iter! ...

  5. Java中如何优雅地删除List中的元素

    在工作中的许多场景下,我们都会使用到List这个数据结构,那么同样的有很多场景下需要删除List中的某一个元素或某几个元素,那么我们该如何正确无误地删除List中的元素的,今天我来教大家三种方式. 前 ...

  6. 如何正确遍历删除List中的元素(普通for循环、增强for循环、迭代器iterator、removeIf+方法引用)

    遍历删除List中符合条件的元素主要有以下几种方法: 普通for循环 增强for循环 foreach 迭代器iterator removeIf 和 方法引用 其中使用普通for循环容易造成遗漏元素的问 ...

  7. 4.19——数组双指针——26. 删除有序数组中的重复项 & 27. 删除有序数组中的重复项II & 80. 删除有序数组中的重复项 II

    第一次做到数组双指针的题目是80: 因为python的List是可以用以下代码来删除元素的: del List[index] 所以当时的我直接用了暴力删除第三个重复元素的做法,大概代码如下: n = ...

  8. 正确遍历删除List中的元素方法(推荐)

    遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过增强的for循环删除符合条件的多个元素 2.通过增强的for循环删除符合 ...

  9. 如何正确遍历删除List中的元素

    遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过增强的for循环删除符合条件的多个元素 2.通过增强的for循环删除符合 ...

随机推荐

  1. CSS学习总结3:CSS定位

    CSS 定位机制 CSS 有三种基本的定位机制:普通流.浮动和绝对定位. 一.普通流 除非专门指定,否则所有框都在普通流中定位.普通流中元素框的位置由元素在(X)HTML中的位置决定.块级元素从上到下 ...

  2. iOS.UITableView.SectionIndex

    1. 为tableview中section建立索引来加速tableview的滚动. http://nshipster.com/uilocalizedindexedcollation/ 2. 获取汉字的 ...

  3. 应用内直接跳转到Appstore

    iOS开发中,应用内直接跳转到Appstore .进入appstore中指定的应用 NSString *str = [NSString stringWithFormat: @"itms:// ...

  4. MSI-X 之有别于MSI

    转自: https://www.cnblogs.com/helloworldspace/p/6760718.html MSI-X Capability结构 MSI-X Capability中断机制与M ...

  5. 电商类web原型制作分享——美丽说【附源文件】

    美丽说是国内白领女性时尚消费品牌,精选上千家优质卖家供应商,为用户提供女装.女鞋.女包.配饰.美妆等品类的优质时尚商品. 此原型模板所用到的组件有搜索框.下拉菜单.输入框.选项卡等.交互动作有切换选项 ...

  6. office 2007,SQL Server 2008,VS2010安装步骤

    office 2007,SQL Server 2008,VS2010的安装顺序是不是office 2007,SQL Server 2008,VS2010呢? 前几天先安装了SQL Server 200 ...

  7. dedecms首页搜索 添加仿百度下拉框

    1:找到uploads/templets/default/head.htm 2: 找到 <input name="q" type="text"  clas ...

  8. 子数整数(P1151&NOIP水题测试(2017082301))

    题目链接:子数整数 水题,不解释,自己看代码: #include<bits/stdc++.h> using namespace std; int main(){ int k; scanf( ...

  9. markdown中自己偶尔需要的小技巧

    慢慢积累,需要时搜索,并记录与此. 1.写文章时,由于markdown不负责首行缩进,所以“空格”需要特殊的方法去实现,最简单方便的是--输入全角空格(切换全角输入,点空格) 2.markdown中注 ...

  10. linux之网络

    一 什么是网络,网络能干什么 网络出现的主要目的就是实现主机和主机之间的通信,而互联网协议(Internet Protocol Suite)就是连接两台计算机之间的internet一系列统一的标准.互 ...