Front Page / Sequences / Classes / set

# set

### Description

`set` is a variadic, associative, extensible sequence of types that supports constant-time insertion and removal of elements, and testing for membership. A `set` may contain at most one element for each key.

### Header

Sequence form | Header
--- | ---
Variadic | `#include <boost/mpl/set.hpp>`
Numbered | `#include <boost/mpl/set/set` n`.hpp>`

### Model of

- Variadic Sequence
- Associative Sequence
- Extensible Associative Sequence

### Expression semantics

In the following table, `s` is an instance of `set`, `pos` is an iterator into `s`, and `x`, `k`, and t1,t2,... tn is a set of unique arbitrary types. [Note: See below for an example of how to construct a `set` from a list of potentially non-unique types — end note]

Expression | Semantics
--- | ---
    set<t1,t2,... tn>
    setn<t1,t2,... tn>
| `set` of elements t1,t2,... tn; see Variadic Sequence.
    set<t1,t2,... tn>::type
    setn<t1,t2,... tn>::type
| Identical to `set` n`<`t1,t2,... tn`>`; see Variadic Sequence.
`begin<s>::type` | An iterator pointing to the beginning of `s`; see Associative Sequence.
`end<s>::type` | An iterator pointing to the end of `s`; see Associative Sequence.
`size<s>::type` | The size of `s`; see Associative Sequence.
`empty<s>::type` | A boolean Integral Constant `c` such that `c::value == true` if and only if `s` is empty; see Associative Sequence.
`front<s>::type` | The first element in `s`; see Associative Sequence.
`has_key<s,k>::type` | A boolean Integral Constant `c` such that `c::value == true` if and only if there is one or more elements with the key `k` in `s`; see Associative Sequence.
`count<s,k>::type` | The number of elements with the key `k` in `s`; see Associative Sequence.
`order<s,k>::type` | A unique unsigned Integral Constant associated with the key `k` in `s`; see Associative Sequence.
    at<s,k>::type
    at<s,k,def>::type
| The element associated with the key `k` in `s`; see Associative Sequence.
`key_type<s,x>::type` | Identical to `x`; see Associative Sequence.
`value_type<s,x>::type` | Identical to `x`; see Associative Sequence.
`insert<s,x>::type` | A new `set` equivalent to `s` except that
    at< t, key_type<s,x>::type >::type
is identical to `value_type<s,x>::type`.
`insert<s,pos,x>::type` | Equivalent to `insert<s,x>::type`; `pos` is ignored.
`erase_key<s,k>::type` | A new `set` equivalent to `s` except that `has_key<t, k>::value == false`.
`erase<s,pos>::type` | Equivalent to `erase<s, deref<pos>::type >::type`.
`clear<s>::type` | An empty `set`; see clear.

### Example

Basic `set` invariants:

    typedef set< int,long,double,int_<5> > s;

    BOOST_MPL_ASSERT_RELATION( size<s>::value, ==, 4 );
    BOOST_MPL_ASSERT_NOT(( empty<s> ));

    BOOST_MPL_ASSERT(( is_same< at<s,int>::type, int > ));
    BOOST_MPL_ASSERT(( is_same< at<s,long>::type, long > ));
    BOOST_MPL_ASSERT(( is_same< at<s,int_<5> >::type, int_<5> > ));
    BOOST_MPL_ASSERT(( is_same< at<s,char>::type, void_ > ));

Constructing a `set` from a list of potentially non-unique types:

    typedef fold<
          vector<int,int,long,long>
        , set0<>
        , insert<_1,_2>
        >::type s;

    BOOST_MPL_ASSERT_RELATION( size<s>::value, ==, 2 );

### See also

Sequences, Variadic Sequence, Associative Sequence, Extensible Associative Sequence, set_c, map, vector