导航
1.set容器及multiset容器基础知识
2.set交换与大小
3.set容器插入与删除
4.set容器查找与统计
5.set与multiset容器的区别
6.pair对组的创建方式
7.set容器排序(改变排序规则)
———————————————————————————————————
1.set容器及multiset容器基础知识
set与multiset都是关联式容器,所有被插入时都会自动排序
set与multiset容器区别:
1.set不能再容器中有重复的数
2.multiset允许容器中有重复的元素
构造函数:
set< T > st
set(const set& st)
赋值:
operator= //赋值
set例子:
#include using namespace std; #include void PrintSet(const set&st) { for(set::const_iterator it = st.begin();it!=st.end();it++) { cout<<(*it)<<" "; } cout< } void test() { set st; st.insert(20); //插入数据用insert st.insert(10); st.insert(30); st.insert(40); st.insert(30); PrintSet(st); set st1(st); //拷贝构造 PrintSet(st1); set st2; st2 = st1; PrintSet(st2); } int main() { test(); system("pause"); return 0; }
运行结果:
———————————————————————————————————
2.set交换与大小
size() //容量
empty(); //若是容器空为1,不空为0
swap() //交换容器
———————————————————————————————————
3.set容器插入与删除
insert() //插入
clear() //清除
erase(pos) //清除pos迭代器所指元素,返回下一个元素
erase(beg,end) //迭代器指向的区间
erase(elem) //删除容器中为elem的元素
例子:
#include using namespace std; #include void PrintSet(const set&st) { for(set::const_iterator it = st.begin();it!=st.end();it++) { cout<<(*it)<<" "; } cout< } void test() { set st; st.insert(20); //插入数据 st.insert(10); st.insert(30); st.insert(40); st.insert(30); PrintSet(st); //遍历 //删除第一个数据 st.erase(st.begin()); PrintSet(st); //删除重载 直接放入值 st.erase(30); //清空 //st.erase(st.begin(),st.end()); st.clear(); PrintSet(st); } int main() { test(); system("pause"); return 0; }
运行结果:
———————————————————————————————————
4.set容器查找与统计
find(key) //找到返回对应元素的迭代器,没有找到返回.end()
cout(key) //set容器中没有重复的数,所以返回0或1
例子:
#include using namespace std; #include void test() { set st; st.insert(20); //插入数据 st.insert(10); st.insert(30); st.insert(30); set::iterator it = st.find(30); //find返回该位置的迭代器,没找到返回st.end() if(it != st.end()) //判断是否相同 { cout<<"找到对应的"<<(*it)< } else { cout<<"没找到"< } cout<<"30的数量为:"< } int main() { test(); system("pause"); return 0; }
运行程序:
———————————————————————————————————
5.set与multiset容器的区别
set插入数据时会返回插入的结果,结果表示插入是否成功
multiset不会检测数据,因此可以插入重复的数据
检验:
#include using namespace std; #include void test() { set st; pair::iterator,bool> ret = st.insert(20); //插入数据 if(ret.second) { cout<<"第一次插入成功"< } else { cout<<"插入失败"< } ret = st.insert(20); if(ret.second) { cout<<"第二次插入成功"< } else { cout<<"插入失败"< } } int main() { test(); system("pause"); return 0; }
运行结果:
———————————————————————————————————
6.pair对组的创建方式
说明:成对成线的数据,利用对组可以返回两个数据
两种创建方式:
pair< type,type>p(value,value)
pair< type,typoe> p = make_pair(value,value)
例子:
#include using namespace std; #include #include //pair对组的创建 void test() { //第一种方式 pair p("Tom",20); cout<<"姓名:"< //第二种 pairp1 = make_pair("小王",15); cout<<"姓名:"< } int main() { test(); system("pause"); return 0; }
运行结果:
———————————————————————————————————
7.set容器排序(改变排序规则)
set容器默认插入时从小到大排序,如何改变排序规则?
利用仿函数,可以改变排序规则,必须在插入数之前确定排序方式
例子:
#include using namespace std; #include #include class Mycompare { public: bool operator()(int v1,int v2) //创建一个带有bool类型的仿函数 { return v1>v2; } }; //pair对组的创建 void test() { set p; //加入自己创建的类 p.insert(10); p.insert(30); p.insert(20); p.insert(15); //遍历 for(set::iterator it = p.begin();it!=p.end();it++) { cout<<(*it)<<" "; } cout< } int main() { test(); system("pause"); return 0; }
运行结果:
若插入自定义数据,如何指定排序规则
例子:
#include using namespace std; #include #include //自定义类 class Person { public: Person(string name,int age) //构造函数 { this->m_name = name; this->m_age = age; } string m_name; int m_age; }; class Mycompare { public: bool operator()(const Person& p,const Person& p1) //创建一个带有bool类型的仿函数 { return p.m_age>p1.m_age; } }; //pair对组的创建 void test() { set st; //创建容器 Person p("小明",15); //自定义数据 Person p1("小红",14); Person p2("小王",16); Person p3("小李",20); st.insert(p); st.insert(p1); st.insert(p2); st.insert(p3); //遍历 for(set::iterator it = st.begin();it!=st.end();it++) { cout<<"姓名:"<m_name<<" 年龄:"<m_age< } } int main() { test(); system("pause"); return 0; }
运行结果: