std::set 中内部元素有序条件删除的理解
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 中内部元素有序条件删除的理解的更多相关文章
- 删除 list 集合中的元素
删除 list 集合中的元素,当删除的元素有多个的时候,只能使用迭代器来删除. 当删除 list 集合中的元素只有一个的时候,有三种方法都可以实现. import java.util.ArrayLis ...
- Java根据条件删除Map中元素
今天在写程序过程中,需要根据判断条件删除一个Map中的相应数据,我自然而然想到可以通过调用Map中的remove(Object key)函数进行删除:代码如下: public Map<Doubl ...
- Map中根据条件删除元素
今天在写程序过程中,需要根据判断条件删除一个Map中的相应数据,我自然而然想到可以通过调用Map中的remove(Object key)函数进行删除:代码如下: public Map<Doubl ...
- vector中的元素删除
删除vector中的元素,最容易的方法就是使用vector的erase()函数. vector vec;for ( vector::iterator iter = vec.begin(); iter! ...
- Java中如何优雅地删除List中的元素
在工作中的许多场景下,我们都会使用到List这个数据结构,那么同样的有很多场景下需要删除List中的某一个元素或某几个元素,那么我们该如何正确无误地删除List中的元素的,今天我来教大家三种方式. 前 ...
- 如何正确遍历删除List中的元素(普通for循环、增强for循环、迭代器iterator、removeIf+方法引用)
遍历删除List中符合条件的元素主要有以下几种方法: 普通for循环 增强for循环 foreach 迭代器iterator removeIf 和 方法引用 其中使用普通for循环容易造成遗漏元素的问 ...
- 4.19——数组双指针——26. 删除有序数组中的重复项 & 27. 删除有序数组中的重复项II & 80. 删除有序数组中的重复项 II
第一次做到数组双指针的题目是80: 因为python的List是可以用以下代码来删除元素的: del List[index] 所以当时的我直接用了暴力删除第三个重复元素的做法,大概代码如下: n = ...
- 正确遍历删除List中的元素方法(推荐)
遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过增强的for循环删除符合条件的多个元素 2.通过增强的for循环删除符合 ...
- 如何正确遍历删除List中的元素
遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过增强的for循环删除符合条件的多个元素 2.通过增强的for循环删除符合 ...
随机推荐
- C# 一段通用的写log 日志的好程序
public void Write(string text) { FileStream fs = new FileStream(Application.StartupPath+"/log.t ...
- DtCMS 在IIS7.0 下之伪静态
1)首先新建一个应用程序池,名称任意,比如:nettest,托管管道模式先暂时设置为集成模式,等下面的一系列设置完成之后再设置成经典模式: 2)部署好站点,并将此站点的应用程序池设置为nettest; ...
- andorid 列表视图之SimpleAdapter
.xml <?xml version="1.0" encoding="utf-8"?> <ListView xmlns:android=&qu ...
- PHP swoole process的使用
引入背景:假如我们每天有10000个订单生成,需要同步到仓储系统中去,以前做法是开启一个crontab去跑这些任务,但是发现总有感觉同步效率低,间隔时间都是分钟级别的. 解决方案测试:我们将同步订单的 ...
- CODE[VS]4228 小猫爬山 小猫爬山
原题链接 第一眼还以为是贪心,然后随便找了几组例子瞬间推翻贪心的想法.发现\(n\leqslant18\),显然是用爆搜+剪枝. 爆搜主体我是对小猫进行枚举,判断增添缆车,其实这是一个比较慢的搜法,而 ...
- Centos PS1
PS1="[\[\e[35m\]\u\[\e[m\]\[\e[31m\]->\[\e[m\]\[\e[33m\]\H\[\e[m\]\[\e[31m\]->\[\e[m\]\[\ ...
- C++ 的虚析构函数
当一个基类的指针指向一个派生类的对象,并用该基类的指针去删除或者析构派生类对象时,如果基类的析构函数不是声明为虚函数,那么在析构时基类的析构函数将会被直接调用,派生类的析构函数应为没被调用而导致内存泄 ...
- Python3字符编码
编码 字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节 ...
- Best Sightseeing Pair LT1014
Given an array A of positive integers, A[i] represents the value of the i-th sightseeing spot, and t ...
- Python 单列
1.__new__内置方法 在对类进行实例化时自动执行 功能1:为对象分配空间 功能2:返回空间的引用 2.单列实现方法 class MusicPlayer: # 记录对象内存引用,初始值为None ...