容器的常规操作
非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");
}

浙公网安备 33010602011771号