容器的常规操作

非map和set容器

  • 这里这样区别的原因是之前已经有过很多容器的基本操作实践,像一些插入、删除、遍历一类的,因为map和set容器的特殊性,所以另外分开。

set容器

  • set的排序操作
#include <iostream>
#include <vector>
#include <string>
#include<algorithm>
#include<set>
#include<functional>
using namespace std;

const int nSize = 3;
class person{
public:
    person(const string& wazname,const int nld):name(wazname),id(nld){}
    string getname() const{
        return name;
    }
    int getid() const{
        return id;
    }
private:
    string name;
    int id;
};

struct personComper
{
    bool operator() (const person& p1, const person& p2) {
        return (p1.getid() < p2.getid() ? false : true);
    }
};

struct print
{
    void operator()(person p){
        cout << p.getname() << endl;
    }
};


int main() {
    const person personArray[nSize] = {
        person("Tom",1),
        person("Jason",2),
        person("Alice",3)
    };

    set<person,personComper> ps1(personArray, personArray + nSize);//这里的perComper是一个仿函数,用来改变默认的set的排序(变为降序)
    for_each(ps1.begin(),ps1.end(),print());

    return 0;
}

  • set相关的算法

set_union:合并两个集合,具体的使用如下:

#include <iostream>
#include <vector>
#include <string>
#include<algorithm>
#include<set>
#include<functional>
using namespace std;

const int nSize = 3;
class person {
public:
    person(const string& wazname, const int nld) :name(wazname), id(nld) {}
    person operator= (person p1) {
        this->id = p1.id;
        this->name = p1.name;
    }
    string getname() {
        return name;
    }
    int getid() {
        return id;
    }
private:
    string name;
    int id;
};

struct personComper
{
    bool operator() (person p1, person p2) const{
        return (p1.getid() < p2.getid() ? false : true);
    }
};

struct print
{
    void operator()(person p) {
        cout << p.getname() << endl;
    }
};


int main() {
    person personArray1[nSize] = {
        person("Tom",1),
        person("Jason",2),
        person("Alice",3)
    };

    person personArray2[nSize] = {
        person("Tom",1),
        person("Chen",2),
        person("Yang",3)
    };

    set<person, personComper> ps1(personArray1, personArray1 + nSize);
    set<person, personComper> ps2(personArray2, personArray2 + nSize);

    set<person, personComper> dest;
    insert_iterator<set<person, personComper>> ii(dest, dest.begin());
    set_union(ps1.begin(), ps1.end(), ps2.begin(), ps2.end(), ii, personComper());

    for_each(ps1.begin(), ps1.end(), print());
    for_each(ps2.begin(), ps2.end(), print());
    //for_each(dest.begin(), itEnd, print());

    return 0;
}

set_difference:求第一个集合中交于第二个集合的元素
用法类似

  • set要是改变元素的手段
    比如这个时候要求改变person的name,其实真正存进set的key是person.id,所以按理说它对应的person.name是可以改变的,但是直接通过iterator是不能改变的,要通过以下的手段:
person personArray1[nSize] = {
       person("Tom",1),
       person("Jason",2),
       person("Alice",3)
   };


   set<person, personComper> ps1(personArray1, personArray1 + nSize);
   /*set<person, personComper>::iterator it = find_if(ps1.begin(), ps1.end(), bind2nd(equal_to<int>(),1));
   if (it != ps1.end()) {
       it->setname("ko");
   }*/
   //以上出错的原因就是不能修改的值

   for_each(ps1.begin(), ps1.end(), print());


   set<person, personComper>::iterator it = ps1.find(person("Jason", 2));
   if (it != ps1.end()) {
       const_cast<person&>(*it).setname("ko");
   }
posted @ 2023-04-06 16:05  铜锣湾陈昊男  阅读(12)  评论(0)    收藏  举报