【转】容器 C++ set和map
2012-02-28 11:15
417 查看
转载地址:/article/1737513.html
容器 C++ set和map
set, multiset
set和multiset会根据特定的排序准则自动将元素排序,set中元素不允许重复,multiset可以重复。
因为是排序的,所以set中的元素不能被修改,只能删除后再添加。
向set中添加的元素类型必须重载<操作符用来排序。排序满足以下准则:
1、非对称,若A<B为真,则B<A为假。
2、可传递,若A<B,B<C,则A<C。
3、A<A永远为假。
set中判断元素是否相等:
if(!(A<B || B<A)),当A<B和B<A都为假时,它们相等。
map, multimap
map和multimap将key和value组成的pair作为元素,根据key的排序准则自动将元素排序,map中元素的key不允许重复,multimap可以重复。
因为是排序的,所以map中元素的key不能被修改,只能删除后再添加。key对应的value可以修改。
向map中添加的元素的key类型必须重载<操作符用来排序。排序与set规则一致。
容器 C++ set和map
set, multiset
set和multiset会根据特定的排序准则自动将元素排序,set中元素不允许重复,multiset可以重复。
因为是排序的,所以set中的元素不能被修改,只能删除后再添加。
向set中添加的元素类型必须重载<操作符用来排序。排序满足以下准则:
1、非对称,若A<B为真,则B<A为假。
2、可传递,若A<B,B<C,则A<C。
3、A<A永远为假。
set中判断元素是否相等:
if(!(A<B || B<A)),当A<B和B<A都为假时,它们相等。
map, multimap
map和multimap将key和value组成的pair作为元素,根据key的排序准则自动将元素排序,map中元素的key不允许重复,multimap可以重复。
因为是排序的,所以map中元素的key不能被修改,只能删除后再添加。key对应的value可以修改。
向map中添加的元素的key类型必须重载<操作符用来排序。排序与set规则一致。
初始化 class A { public: bool operator < (const A&) const { cout<<"A::operator <"<<endl; return false; } }; //自定义的函数对象 template<typename T> class FunObj { public: FunObj():status(true){} FunObj(int):status(false){} bool operator ()(const T&, const T&) { cout<<boolalpha<<status<<endl; return status; } private: bool status; }; int main() { set<A> sNone; //使用A类型的操作符<作为排序标准 set<A, FunObj<A>> sDefault; //使用函数对象作为排序标准,函数对象由默认构造函数构造 set<A, FunObj<A>> sSpecific((FunObj<A>(1))); //使用函数对象作为排序标准,函数对象由指定构造函数构造 sNone.insert(A()); sNone.insert(A()); //call A::operator < sDefault.insert(A()); sDefault.insert(A()); //FunObj<A>::operator (), constructed by FunObj() sSpecific.insert(A()); sSpecific.insert(A()); //FunObj<A>::operator (), constructed by FunObj(int) return 0; } 添加、删除元素 set<A> si; pair<set<A>::iterator, bool> p = si.insert(A()); //返回pair,第二个值表示是否插入成功 cout<<boolalpha<<p.second<<endl; set<A>::iterator it = si.insert(si.begin(), A()); //从指定位置开始查找,返回新元素的位置, si.erase(A()); //删除值与参数相等的元素,返回删除元素个数 si.erase(si.begin()); //删除指定位置的元素,无返回值 si.clear(); //清空set //map的insert对象是pair map<A, A> m; A a,b; m.insert(map<A,A>::value_type(a,b)); //map<>::value_type() m.insert(pair<A,A>(a,b)); //pair m.insert(make_pair(a,b)); //make_pair() 其它操作 cout<<si.count(4)<<endl; //count返回值与指定参数相等的元素个数 set<int>::iterator it = si.find(3); //find返回第一个值与指定参数相等的位置,若没有,则返回end it = si.lower_bound(3); //lower_bound返回第一个可以安插新元素的位置,即set中第一个>=新元素的位置 it = si.upper_bound(3); //upper_bound返回最后一个可以安插新元素的位置,即set中第一个>新元素的位置 pair<set<int>::iterator, set<int>::iterator> p = si.equal_range(3); //equal_range返回set中元素与参数值相等的区间 // test.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <vector> #include <iostream> #include <string> #include <list> #include <algorithm> #include <map> #include <set> // 自定义数据的插入 struct student{ char name[20]; int age; char city[20]; char phone[20]; }; // 这里采用函数对象的方式设置,与set中有不同,key设置为city,注意应设置为public class stuCmp{ public: stuCmp() { } stuCmp(int d) { } bool operator()(const student& a,const student& b) const{ return strcmp(a.city,b.city)<0; } }; int _tmain(int argc, _TCHAR* argv[]) { using namespace std; student stu1={"童进",23,"长沙","XXX"}; student stu2={"老大",28,"武汉","XXX"}; //老大,你成熟了5岁,哈哈 student stu3={"饺子",23,"福州","XXX"}; // multiset<student,stuCmp> b; multiset<student,stuCmp> b(stuCmp(1)); b.insert(stu1); b.insert(stu2); b.insert(stu3); // 武汉同学最多,只是现在大家又都天各一方 student stu4={"小芳",23,"武汉","XXX"}; student stu5={"黄庆",23,"武汉","XXX"}; student stu6={"英俊",23,"武汉","XXX"}; b.insert(stu4); b.insert(stu5); b.insert(stu6); for(multiset<student,stuCmp>::iterator i=b.begin();i!=b.end();i++){ cout<<i->name<<endl; } student key={"",99,"武汉","XXX"}; cout<<"武汉朋友数目:"<<b.count(key)<<endl; cout<<"武汉的第一个朋友:"<<b.lower_bound(key)->name<<endl; cout<<"武汉最后一个朋友:"<<(--b.upper_bound(key))->name<<endl; // 这里武汉是最后的,再大于这个键值,就会返回end()指向头节点,所以-- for(multiset<student,stuCmp>::reverse_iterator j=b.rbegin();j!=b.rend();j++){ cout<<j->name<<endl; } // 验证set中的猜测,此时键值为city student test={"路人甲",99,"武汉","XXX"}; multiset<student,stuCmp>::iterator v=b.find(test); //返回第一个与键值相等的迭代器 cout<<"寻找武汉的路人甲:"<<v->name<<endl; // 元素搜索 cout<<"搜索武汉的朋友们:"<<endl; pair<multiset<student,stuCmp>::iterator,multiset<student,stuCmp>::iterator> p=b.equal_range(test); for(multiset<student,stuCmp>::iterator k=p.first;k!=p.second;k++){ cout<<k->name<<endl; } return 0; }
相关文章推荐
- c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑
- C++学习STL之关联容器 --- pair、map、set
- c++STL容器(map,set,vector,stack,queue)
- C++:关联容器(set,multiset,map,multimap)
- C++ STL容器的学习使用(vector、queue、list、set、map)
- C++各个容器比较(vector,deque,list,set,map,queue,stack)
- C++的STL容器之关联性容器set、multiset、map、multimap
- C++中STL容器的分类和基本功能(二):集合(set) 映射(map)
- C++各个容器比较(vector,deque,list,set,map,queue,stack)
- C++ STL标准库的关联容器set与map
- C++中防止STL中迭代器失效__map/set等关联容器vector/list/deque等序列容器_如何防止迭代器失效_即erase()的使用
- C++:关联容器(pair、map、set)
- 容器 C++ set和map
- C++ Primer学习笔记(11)——(转)c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑
- C++各个容器比较(vector,deque,list,set,map,queue,stack)
- C++中防止STL中迭代器失效__map/set等关联容器vector/list/deque等序列容器_如何防止迭代器失效_即erase()的使用
- C++语法——容器类(list, vector, map, set)
- C++ 关联容器, map,set
- C++关联容器:map,set...
- C++联合容器set和map