这是微软帮助文档中对集合(set)的解释: “描述了一个控制变长元素序列的对象(注:set中的key和value是Key类型的,而map中的key和value是一个pair结构中的两个分量)的模板类,每一个元素包含了一个排序键(sort key)和一个值(value)。对这个序列可以进行查找、插入、删除序列中的任意一个元素,而完成这些操作的时间同这个序列中元素个数的对数成比例关系,并且当游标指向一个已删除的元素时,删除操作无效。”
而一个经过更正的和更加实际的定义应该是:一个集合(set)是一个容器,它其中所包含的元素的值是唯一的。这在收集一个数据的具体值的时候是有用的。集合中的元素按一定的顺序排列,并被作为集合中的实例。如果你需要一个键/值对(pair)来存储数据,map是一个更好的选择。一个集合通过一个链表来组织,在插入操作和删除操作上比向量(vector)快,但查找或添加末尾的元素时会有些慢。
下面是一个例子:
//程序:set演示
//目的:理解STL中的集合(set)
#include <string>
#include <set>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
set <string> strset;
set <string>::iterator si;
strset.insert("cantaloupes");
strset.insert("apple");
strset.insert("orange");
strset.insert("banana");
strset.insert("grapes");
strset.insert("grapes");
for (si=strset.begin(); si!=strset.end(); si++)
{ cout << *si << " "; }
cout << endl;
return 0;
}
// 输出: apple banana cantaloupes grapes orange
//注意:输出的集合中的元素是按字母大小顺序排列的,而且每个值都不重复。
如果你感兴趣的话,你可以将输出循环用下面的代码替换:
copy(strset.begin(), strset.end(), ostream_iterator<string>(cout, " "));
.集合(set)虽然更强大,但我个人认为它有些不清晰的地方而且更容易出错,如果你明白了这一点,你会知道用集合(set)可以做什么。
头文件:<set>
set<T>:由节点组成的红黑树,每个节点都包含一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序。具有快速查找功能,但是以牺牲插入和删除操作效率为代价的。
set类的主要成员
iterator begin(); //指向set的头指针
const_iterator begin() const; //返回set的常量头指针
void clear(); //删除所有元素
size_type count(const key_type& x)const; //返回键为x的元素的个数
bool empty() const; //返回是否为空
iterator end(); //指向set的尾指针
const_iterator end() const(); //返回set的常量尾指针
void erase(iterator position); //删除在位置position的元素
size_type erase(const key_type& x); //删除索引为x的元素
void erase(iterator first, iterator last); //删除在[first,last]间的元素
pair<iterator, iterator>equal_range(const key_type& x)const; //返回一个迭代器对(指向键不小于x的第一个元素的迭代器,指向键大于x的第一个元素的迭代器)
iterator find(const key_type& x)const; //返回索引为x的元素的指针
allocator_type get_allocator() const; //返回构造函数的一个拷贝
pair<iterator,bool>insert(const value_type& x); //返回<指向元素x的迭代器,是否插入成功>
template<class InputIterator>void insert(InputIterator first,InputIterator last); //插入值在[first,last]间的一个序列。
interator lower_bound(const key_type& x)const; //返指向键不小于x的第一个元素的迭代器
size_type max_size()const; //返回该set可以控制的最大长度
reverse_iterator rbegin(); //返回反向set的反向头指针
const_reverse_iterator rbegin() const; //返回反向set的反向常量头指针
reverse_iterator rend(); //返回反响set的反向尾指针
void resize(size_type Sz, T C=T()); //插入或删除使元素的个数为n,插入的元素为C
const_reverse_iterator rend() const; //返回反向set的反向尾指针
explicit set(const Compare& comp = Compare(), const Allocator = Allocator());
template<class InputIterator>set(InputIterator first, InputIterator last, const Compare& Comp = Compare(), const Allocator& X = Allocator()); //构造函数类型,如
set<int>::allocator_type s1_Alloc;
s1_Alloc = s1.get_allocator();
set <int> s2(s1.begin(), s1.end(), less<int>, s1_alloc);
set(const set<Key, Compare,Allocator>& X);
~set(); //析构函数
size_type size() const; //返回set的大小
void swap(set& X); //与setX交换内容
iterator upper_bound(const key_type& x)const; //返回指向键大于x的第一个元素的迭代器
头文件:<set>
multiset<T>是一种允许出现重复元素的集合容器,和集合基本相同,但可以支持重复元素具有快速查找能力。
multiset的主要函数:与set基本一样
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/leishiwei/archive/2009/11/04/4766633.aspx