1 multiset
多重集合(multiset) 允许存在两个次序相等的元素的集合 <set>
2 set
集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序 <set>
1 count
统计数量
2 equal_range(const T&);找到红黑树的链表结点,遍历所有的元素
3 find();查找元素
4 insert(const T&);插入
5 size();返回当前向量中已经存放的对象的个数
1 multiset
多重集合(multiset) 允许存在两个次序相等的元素的集合 <set>
1 #include <iostream> 2 #include <set> 3 4 int main() 5 { 6 std::multiset<int>myset; 7 8 myset.insert(11); 9 myset.insert(12); 10 myset.insert(13); 11 myset.insert(10); 12 myset.insert(10); 13 myset.insert(100);//和set不同,元素可以重复 14 15 auto ib = myset.begin(); 16 auto ie = myset.end(); 17 18 for (; ib != ie; ib++) 19 { 20 std::cout << *ib << std::endl; 21 printf("%p,%p ", ib._Ptr, ib);//智能指针 22 } 23 24 return 0; 25 }
multiset每一个结点都是一个链表,set每个结点是一个结点而已
1 #include <iostream> 2 #include <set> 3 4 struct student 5 { 6 int id; 7 char name[30]; 8 }; 9 10 struct stuless 11 { 12 bool operator()(const student &s1, const student &s2)//重载() 13 { 14 return s1.id < s2.id; 15 } 16 }; 17 18 int main() 19 { 20 student sarray[3] = { {10,"hello"},{ 3,"world" },{ 4,"hello world" } }; 21 std::multiset<student, stuless>myset(sarray, sarray + 3, stuless());//multiset每一个结点都是一个链表,set每个结点是一个结点而已 22 23 student stu1 = { 20,"world hello" }; 24 25 myset.insert(stu1);//插入 26 27 auto ib = myset.begin(); 28 auto ie = myset.end(); 29 30 for (; ib != ie; ib++) 31 { 32 std::cout << ib->id << " " << ib->name << std::endl; 33 } 34 35 return 0; 36 }
multiset的元素可以重复,因此equal_range(const T&);可以实现查找多个相同的元素
1 #include <iostream> 2 #include <set> 3 4 void main() 5 { 6 std::multiset<int>myset; 7 8 myset.insert(100);//插入 9 myset.insert(101); 10 myset.insert(100); 11 myset.insert(103); 12 myset.insert(100); 13 14 auto pfind = myset.find(101);//find只查找一个元素 15 std::cout << *pfind << std::endl << std::endl; 16 17 auto allfind = myset.equal_range(100);//equal_range找到红黑树的链表结点,遍历所有的元素 18 19 for (auto it = allfind.first; it != allfind.second; it++)//first是链表的头结点,second是最后一个空结点 20 { 21 std::cout << *it << std::endl; 22 } 23 }
count
1 #include <iostream>
2 #include <set>
3
4 void main()
5 {
6 std::multiset<int>myset;
7
8 myset.insert(3);
9 myset.insert(1);
10 myset.insert(2);
11 myset.insert(1);
12 myset.insert(2);
13 myset.insert(1);
14 myset.insert(2);
15 myset.insert(1);
16
17 int i = 0;
18 for (auto ib = myset.begin(), ie = myset.end(); ib != ie; ib++)
19 {
20 i++;
21 }
22
23 std::cout << i << std::endl;//打印结点数量
24
25 std::cout << count(myset.begin(), myset.end(), 1);//打印结点元素是1的数量
26 }
multiset可以自动排序
1 #include <iostream> 2 #include <algorithm> 3 #include <set> 4 5 template <class T> 6 struct show 7 { 8 public: 9 void operator()(T &t) 10 { 11 std::cout << t << " "; 12 } 13 }; 14 15 void main() 16 { 17 std::multiset<int>myset; 18 19 myset.insert(3); 20 myset.insert(1); 21 myset.insert(2); 22 myset.insert(1); 23 myset.insert(2); 24 myset.insert(1); 25 myset.insert(2); 26 myset.insert(1); 27 28 for_each(myset.begin(), myset.end(), show<const int>()); 29 }
2 set
集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序 <set>
find();查找元素
size();返回当前向量中已经存放的对象的个数
1 #include <iostream> 2 #include <set> 3 4 void main() 5 { 6 std::set<int>myset;//红黑树 7 8 myset.insert(10); 9 myset.insert(9); 10 myset.insert(8); 11 myset.insert(7); 12 myset.insert(6); 13 myset.insert(5); 14 myset.insert(4); 15 myset.insert(10);//如果插入的元素已经存在,将会放弃插入 16 17 auto ib = myset.begin(); 18 auto ie = myset.end(); 19 20 for (; ib != ie; ib++)//即使插入的顺序是乱序,但是也会按从小到大的顺序输出 21 { 22 std::cout << *ib << std::endl; 23 } 24 }
find查找元素
1 #include <iostream> 2 #include <set> 3 4 void main() 5 { 6 std::set<int>myset;//红黑树 7 8 myset.insert(10); 9 myset.insert(9); 10 myset.insert(8); 11 myset.insert(7); 12 myset.insert(6); 13 myset.insert(5); 14 myset.insert(4); 15 16 auto findpos = myset.find(10); 17 18 std::cout << *findpos << std::endl; 19 }
size();返回当前向量中已经存放的对象的个数
1 #include <iostream> 2 #include <set> 3 4 void main() 5 { 6 std::set<int>myset;//红黑树 7 8 myset.insert(10); 9 myset.insert(9); 10 myset.insert(8); 11 myset.insert(7); 12 myset.insert(6); 13 myset.insert(5); 14 myset.insert(4); 15 myset.insert(10);//如果插入的元素已经存在,将会放弃插入 16 17 std::cout << myset.size() << std::endl;//返回当前向量中已经存放的对象的个数 18 }
红黑树,处理纯数字非常少,处理类对象以及字符串
pari起到获取插入返回值,第一个类型,类型比大小的方式
1 #include <iostream> 2 #include <set> 3 #include <string> 4 5 struct strless 6 { 7 bool operator()(const char *str1, const char *str2)//重载() 8 { 9 return strcmp(str1, str2) < 0; 10 } 11 }; 12 13 //红黑树,处理纯数字非常少,处理类对象以及字符串 14 15 int main() 16 { 17 const char *cmd[] = { "abc", "calc", "notepad", "const", "xyz", "ghi" }; 18 19 std::set<const char *, strless>myset(cmd, cmd + 6, strless());//构造 20 myset.insert("1234");//插入 21 myset.insert("4567"); 22 23 std::pair<std::set<const char *>::iterator, bool>p = myset.insert("9876");//pari起到获取插入返回值,第一个类型,类型比大小的方式 24 25 auto ib = myset.begin(); 26 auto ie = myset.end(); 27 28 for (; ib != ie; ib++)//迭代器访问 29 { 30 std::cout << *ib << std::endl; 31 } 32 std::cout << std::endl; 33 34 auto rb = myset.rbegin(); 35 auto re = myset.rend(); 36 37 for (; rb != re; rb++)//反向迭代器访问 38 { 39 std::cout << *rb << std::endl; 40 } 41 std::cout << std::endl; 42 43 std::set<const char *, strless>::iterator pfind = myset.find("calc");//查找 44 std::cout << *pfind << std::endl; 45 46 return 0; 47 }