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循环删除符合 ...
随机推荐
- BZOJ1226或洛谷2157 [SDOI2009]学校食堂
BZOJ原题链接 洛谷原题链接 注意到\(B[i]\)很小,考虑状压\(DP\). 设\(f[i][j][k]\)表示前\(i - 1\)个人已经拿到菜,第\(i\)个人及其后面\(7\)个人是否拿到 ...
- APP强制退出
第一种方法: 企业版可以用,Appstore可能被拒,慎用 - (void)exitApplication { AppDelegate *app = [UIApplication sharedAppl ...
- 关于nodejs 假设httpserver,会发现一次网页打开,服务端会响应两次的问题;
转自:http://cnodejs.org/topic/518772806d38277306804020 每个页面默认都会再发一个de style="line-height: 21px; p ...
- codeforces 数字区分 搜索
Jokewithpermutation Input file: joke.inOutput file: joke.outJoey had saved a permutation of integers f ...
- Python generator 的yield (enumerate)
生成杨辉三角 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 def triangles(max): L = [1,] while len(L) - 1 < ...
- 会话和http请求
一次HTTP请求和响应的过程 域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> ...
- 原创:Spring整合junit测试框架(简易教程 基于myeclipse,不需要麻烦的导包)
我用的是myeclipse 10,之前一直想要用junit来测试含有spring注解或动态注入的类方法,可是由于在网上找的相关的jar文件进行测试,老是报这样那样的错误,今天无意中发现myeclips ...
- Angular的一些用法或者结构技巧
如果有更好的方式,请留言交流: 2017-07-07 多个controller共用一个函数.在$rootScope中定义方法, $rootScope.share_fun = function test ...
- keepalived配虚拟ip(vip)的作用
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议. 虚拟路由冗余协议,可以认为是实现路由器高可用的 ...
- windows mysql 主从热备
环境说明: Master:192.168.1.200 Slave:192.168.1.210 MySQL 的 Master 配置: 配置my.ini: [mysqld] # T ...