STL中关联容器

本文介绍STL中的关联容器的内容。

关联容器中的元素根据一些排序规则自动进行排序的。缺省的排序规则是关系运算符 <(小于)。用户也可以指定自己的排序规则选项。


因为关联容器中的元素是自动排序的,因此,当一个新的元素插入到容器中时,它插入到容器中适当的位置。一种方便和快速的实现该类数据结构的方式是使用二叉搜索树。实际上这就是关联容器实现的方式。因此,容器中每个元素有一个父节点(除了根结点),同时最多有两个孩子,对于各个元素,父节点的key大于左孩子的key,同时小于右孩子的key


STL中预定义的关联容器如下:

  • Sets
  • Multisets
  • Maps
  • Multimaps
以下学习 关联容器 sets和multisets

关联容器:set和multiset
根据上面介绍的内容,缺省情况下,set和multiset中的元素是按升序来排列的。然而,用户可以指定其他的排序规则。对于用户定义的数据类型,像类,其关系操作符必须被合适的重载。

关联容器set和multiset之间唯一的不同是:multiset容器中允许有副本(duplicates),而容器set中不可以有。

定义容器set的类名为set;定义容器multiset的类名为multiset。包含类set和multiset的定义以及实现这些容器的各种操作的函数的定义的头文件名为<set>。因此,当在程序中使用这些容器时,需要包含如下语句:
#include <set>

声明关联容器set和multiset
类set和multiset包含几个构造器来声明和初始化这些类型容器。如下对关联容器的声明和初始化的各个方式进行讨论,下表描述了指定类型的set/multiset容器的声明和初始化
STL中关联容器_第1张图片
若想使用其他的排序规则,而不是缺省规则。那么在声明容器时,必须指定该规则选项,例如,考虑如下语句:
set<int> intSet;										//Line 1
set<int, greater<int> > otherIntSet;						//Line 2
multiset<string> stringMultiSet;						//Line 3
multiset<string, greater<string> > otherStringMultiset;	//Line 4
第一行居于声明了一个空的set容器intSet,元素类型为int。排序规则是缺省的排序规则。
第二行语句声明了一个空的set容器otherIntSet,元素类型为int,排序规则是>(大于,greater-than),即容器otherIntSet中的元素以降序进行排序。
第三行和第四行具有相似的情况。

第二行和第四行语句展示了如何指定降序排序规则。

从set/multiset中插入项和删除项
假设ct是类型为set或multiset的容器。下表描述了插入元素到set或从set中删除元素的操作,同时也展示了如何使用这些操作,
STL中关联容器_第2张图片
如下源代码展示了set/multiset容器的各种操作:
#include <iostream>
#include <set>
#include <string>
#include <iterator>
#include <algorithm>

using namespace std;

int main()
{
	set<int> intSet;
	set<int, greater<int> > intSetA;

	set<int, greater<int> >::iterator intGtIt;

	ostream_iterator<int> screen(cout, " ");

	intSet.insert(16);
	intSet.insert(8);
	intSet.insert(20);
	intSet.insert(3);

	cout << "intSet: ";
	copy(intSet.begin(), intSet.end(), screen);
	cout << endl;
	cout << "==================================================" << endl;

	intSetA.insert(36); 
	intSetA.insert(84); 
	intSetA.insert(30); 
	intSetA.insert(39);
	intSetA.insert(59); 
	intSetA.insert(238);
	intSetA.insert(156);

	cout << "intSetA:"; 
	copy(intSetA.begin(), intSetA.end(), screen); 
	cout << endl; 
	cout << "==================================================" << endl;
	
	intSetA.erase(59); 
	
	cout << "After removing 59,intSetA: "; 
	copy(intSetA.begin(), intSetA.end(), screen); 
	cout << endl; 
	cout << "==================================================" << endl;

	intGtIt=intSetA.begin();
	++intGtIt; 
	++intGtIt;
	++intGtIt; 

	intSetA.erase(intGtIt);
	cout << "After removing the fourth "
		<< "element," << endl
		<< "	intSetA: "; 
	copy(intSetA.begin(),intSetA.end(),screen); 
	cout<<endl; 
	cout << "==================================================" << endl;

	set<int,greater<int> > intSetB(intSetA); 
	cout << "intSetB:";  
	copy(intSetB.begin(), intSetB.end(), screen); 
	cout << endl; 
	cout << "==================================================" << endl;

	intSetB.clear(); 

	cout<<"After removing all elements,"
		<< endl << "	intSetB: "; 
	copy(intSetB.begin(), intSetB.end(), screen); 
	cout << endl; 
	cout << "==================================================" << endl;

	multiset<string, greater<string> > namesMultiSet; 
	multiset<string, greater<string> >::iterator iter;

	ostream_iterator<string> pScreen(cout, " "); 

	namesMultiSet.insert("Donny"); 
	namesMultiSet.insert("Zippy"); 
	namesMultiSet.insert("Goofy"); 
	namesMultiSet.insert("Hungry"); 
	namesMultiSet.insert("Goofy"); 
	namesMultiSet.insert("Donny"); 

	cout << "namesMultiSet: ";
	copy(namesMultiSet.begin(), namesMultiSet.end(), pScreen); 
	cout << endl;
	cout << "==================================================" << endl;

	return 0;
}

输出结果如下:
STL中关联容器_第3张图片

你可能感兴趣的:(STL中关联容器)