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. Android.Libraries

    1. Android Dependencies, Referenced Libraries, Android Private Libraries Android Private Libraries - ...

  2. linux系统web站点设置-http基础设置

    一.httpd2.2的组成: /etc/httpd:服务器的根目录 conf/httpd.conf,conf.d/*:配置文件 conf/magic:MIME的配置文件 logs:日志文件的存放路径, ...

  3. JoyOI1035 棋盘覆盖

    原题链接 对棋盘染色,坐标和为奇数的染黑,偶数为白.这时会发现对于相同颜色的格子,是无法放置骨牌的,这样我们就将所有格子分成两类,然后根据能否放置骨牌连边,最后就是求二分图最大匹配了. 这里我是用的匈 ...

  4. 20165213 java学习第一周

    20165213 -2018-2<Java程序设计>第一周学习总结 教材学习内容总结 java的四个特点:面向对象.平台无关性.动态性.简单. java编写程序步骤:再有jdk的情况下,先 ...

  5. 繁体简体转化_langconv.py

    from copy import deepcopyimport re try: import psyco psyco.full()except: pass try: from zh_wiki impo ...

  6. xcode资源管理

    1. 在根目录放图片. UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ok.pn ...

  7. java连接数据库以及连接参数格式

    //链接数据库代码部分  下面具有连接的基本参数可以对照修改(参数存放在file下面的database.properties下面) //参数存放在file下面的database.properties下 ...

  8. SQL表两列取一列唯一值的记录

    问下SQL表两列取一列唯一值的 A列         B列       C列 1001      AA      2012-01-02 1001      BB      2012-02-05 100 ...

  9. Java环境编写

    首先安装jdk,本系统中jdk安装在D:\jdk:jre安装在D:\Jre: 然后开始配置环境变量: JAVA_HOME:D:\jdk; JRE_HOME:D:\jre; CLASSPATH:.;%J ...

  10. Django 文章标签功能

    使用第三方框架django-taggit为模型添加标签功能,此模块是一个可复用的应用 首先安装 https://github.com/alex/django-taggit 这是项目主页 pip ins ...