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(1);
    s.insert(2);
    s.insert(3);

    for(it=s.begin();it!=s.end();){
        if((*it)%2==0)
            s.erase(it++);
        else
            it++;
    }

    system("pause");

    return 0;
}

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(44, 22));
    container.insert(new Name(33, 22));
    container.insert(new Name(11, 22));
    container.insert(new Name(42, 22));
    container.insert(new Name(99, 22));
    container.insert(new Name(66, 22));

    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 > 50)
            (*it)->a -= 10;
        else
        {
            (*it)->a += 1000;
        }

    }
    container.insert(new Name(0, 22));
    container.insert(new Name(300, 22));
    //显示
    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 0;
}

  

   

endl;

原文地址:https://www.cnblogs.com/icmzn/p/9669613.html

时间: 2024-10-13 15:47:25

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

(20)ElasticSearch java项目中的根据指定条件删除文档和查询所有文档

1.删除index1中,title包含工厂的文档 @Test public void testQueryDelete() throws IOException, InterruptedException, ExecutionException { //指定集群 Settings settings = Settings.builder().put("cluster.name","my-application").build(); //创建客户端 TransportCl

26、删除有序数组中的元素,数组仍然有序

删除有序数组中的元素,数组仍然有序 方法一: 删除一个有序数组的一个元素,采用两个数组实现 代码实现: /* 2017年6月19日16:16:31 功能:删除数组中一个数据之后数组依然有序 */ #include"stdio.h" #define M 9 int main() { int a[M] = {1,2,3,4,5,6,7,8,9}; int b[M-1]; int i, j, num; bool flag; printf("请输入将要删除的数据的数值:")

vector中的元素删除

删除vector中的元素,最容易的方法就是使用vector的erase()函数. vector vec;for ( vector::iterator iter = vec.begin(); iter! = vec.end();){    if(某条件成立)        iter = vec.erase(iter);    else        iter ++;} 如果要清空vector中的元素,可以使用erase()循环删除,也可以用clear()函数. for ( vector::iter

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

遍历删除List中符合条件的元素主要有以下几种方法: 普通for循环 增强for循环 foreach 迭代器iterator removeIf 和 方法引用 (一行代码搞定) 其中使用普通for循环容易造成遗漏元素的问题,增强for循环foreach会报java.util.ConcurrentModificationException并发修改异常. 所以推荐使用迭代器iterator,或者JDK1.8以上使用lambda表达式进行List的遍历删除元素操作. 以下是上述几种方法的具体分析: 1.

约瑟夫问题 算法很简单保证每隔人都能看懂用数组实现 利用循环删除数组中的元素

#include<iostream> using namespace std; const int size = 1000; void ArrDel() { int arr[size]; //循环结束标志,一直循环到数组中只剩下最后一个元素结束 int currentNum = size; int count = 0; for (int k = 0; k < size; k++) { arr[k] = k; } //currentNum==1表示数组中只剩下最后一个元素 是循环结束的标志

动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有

 1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /************************************************************************/ /*数组的结构体类型                                                    */ /*******************

使有序序列中每个元素最多出现2次的几种算法实现

问题描述(来源:leetcode--Remove Duplicates from Sorted Array II) 对于一个给定的已排序序列,要求实现一个算法:使序列中同一元素出现的次数不超过2次,对超过2次的同一元素直接删除,例如: 输入:给定序列A={1,1,1,2,2,3} 输出:要求返回length =5,A变为{1,1,2,2,3} 一.实现1 1.方式:该实现使用计数count,比较直观,而较容易想到,且扩展性较好,如果想将条件改为:最多出现n次,只需将条件count!=2改为cou

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

遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过增强的for循环删除符合条件的多个元素 2.通过增强的for循环删除符合条件的一个元素 3.通过普通的for删除删除符合条件的多个元素 4.通过Iterator进行遍历删除符合条件的多个元素 /** * 使用增强的for循环 * 在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException */ public

08.18 javascript 06 数组 数组的概念 创建数组 读取数组中的元素 稀疏数组 添加和删除数组的元素 数组遍历 多维数组 数组的方法 类数组对象 作为数组的字符串

# 数组 ### 数组的概念 * 数组是值的有序集合 * 数组中的每个值 称之为 元素 * 每个元素可以是任意数据类型的值 * 每个元素都有索引(下标) * 元素的索引从0开始,按照顺序递增. 元素最大的索引 2^32-2 ### 创建数组 * 直接量 `[]` * 构造函方式  `new Array()` ### 读写数组中的元素 * 数组名[索引] ### 稀疏数组 * js数组的索引是连续的 * 没有连续的给元素赋值 , 没有赋值的元素会自动赋值 undefined ### 添加和删除 数