zz C++中的set

来源:互联网 发布:windows手机应用市场 编辑:程序博客网 时间:2024/05/22 15:14

这是微软帮助文档中对集合(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基本一样

原创粉丝点击