set, map

  set的特性是, 所有元素都会根据键值自动被排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值,并且不允许两个元素有相同的键值, 但multiset允许相同键值。

  set的元素值不可以通过迭代器改变,因为其元素值就是键值,关系到set的排列规则。在源代码中,set<T>::iterator被定义为底层RB-tree的const_iterator,杜绝写入操作。

  set的底层机制其实就是RB-tree(SGI还提供另一种以hash-table为底层机制的set,称为hash_set),几乎所有set的操作都是转调用rb_tree的操作,由于不允许重复键值,所以一定是使用rb_tree的insert_unique()而不能用insert_equal()。

  set缺省情况采用递增排序。

int i;
int ia[5] = { 0, 1, 2, 3, 4};
set<int> iset(ia, ia+5);
cout<<iset.size()<<endl;	// 5,size()获取窗口的元素个数
cout<<iset.count(3)<<endl;	// 1,count(const key_type&x)获取键值为x的元素个数
iset.insert(3);			// 由于不允许重复元素,所以insert()调用失败
cout<<iset.size()<<endl;	// 5
iset.insert(5);
cout<<iset.size()<<endl;	// 6
iset.erase(1);
cout<<iset.size()<<endl;	// 5

it1 = find(iset.begin(), iset.end(), 3);// 可以用STL算法find()来搜寻元素,但效率不是最佳的
set<int>::iterator it1 = iset.find(3);	// 对于关联式容器,应该使用容器提供的find函数来搜索
it1 = find(iset.begin(), iset.end(), 3);



  map的特性是,所有元素都会根据元素的键值自动被排序,map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一个元素被视为键值,第二个元素被视为实值。map不允许相同键值,但multimap允许相同键值。

  map的底层机制和set一样,也是rb_tree,所以用法也是类似的,就不多说了。





你可能感兴趣的:(set, map)