码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-09-18 17:25:21      阅读:497      评论:0      收藏:0      [点我收藏+]

标签:ima   name   内容   type   stream   src   std   ret   begin   

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;

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

标签:ima   name   内容   type   stream   src   std   ret   begin   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!