| 类别: 容器 | 组件类型: 类型 |
集合和多重集合特别适合集合算法包含, 集合并, 集合交, 集合差,和集合对称差。原因有两个。首先,集合算法要求它们的论点是排序的范围,并且,由于集合和多重集合是 排序关联容器,它们的元素始终按升序排序。其次,这些算法的输出范围始终是排序的,并且将排序的范围插入到集合或多重集合是一个快速操作:唯一排序关联容器 和 多个排序关联容器 要求保证,如果范围已经排序,则插入范围只需要线性时间。
多重集合具有以下重要属性:将新元素插入到多重集合不会使指向现有元素的迭代器失效。从多重集合中删除元素也不会使任何迭代器失效,当然,指向正在删除的元素的迭代器除外。
int main()
{
const int N = 10;
int a[N] = {4, 1, 1, 1, 1, 1, 0, 5, 1, 0};
int b[N] = {4, 4, 2, 4, 2, 4, 0, 1, 5, 5};
multiset<int> A(a, a + N);
multiset<int> B(b, b + N);
multiset<int> C;
cout << "Set A: ";
copy(A.begin(), A.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "Set B: ";
copy(B.begin(), B.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "Union: ";
set_union(A.begin(), A.end(), B.begin(), B.end(),
ostream_iterator<int>(cout, " "));
cout << endl;
cout << "Intersection: ";
set_intersection(A.begin(), A.end(), B.begin(), B.end(),
ostream_iterator<int>(cout, " "));
cout << endl;
set_difference(A.begin(), A.end(), B.begin(), B.end(),
inserter(C, C.begin()));
cout << "Set C (difference of A and B): ";
copy(C.begin(), C.end(), ostream_iterator<int>(cout, " "));
cout << endl;
}
| 参数 | 描述 | 默认值 |
|---|---|---|
| Key | 集合的键类型和值类型。这也被定义为multiset::key_type和multiset::value_type | |
| Compare | 键比较函数,一个 严格弱排序,其参数类型为key_type;它返回true如果它的第一个参数小于它的第二个参数,否则返回false。这也被定义为multiset::key_compare和multiset::value_compare. | less<Key> |
| Alloc | 的多重集合分配器,用于所有内部内存管理。 | alloc |
| 成员 | 定义位置 | 描述 |
|---|---|---|
| value_type | 容器 | 对象类型,T,存储在多重集合中。 |
| key_type | 关联容器 | 与value_type. |
| key_compare | 排序关联容器 | 函数对象,用于比较两个键的顺序。 |
| value_compare | 排序关联容器 | 函数对象,用于比较两个值的顺序。 |
| pointer | 容器 | 指向T. |
| reference | 容器 | 指向T |
| const_reference | 容器 | 指向T |
| size_type | 容器 | 一个无符号整型。 |
| difference_type | 容器 | 一个有符号整型。 |
| iterator | 容器 | 迭代器,用于遍历多重集合. |
| const_iterator | 容器 | 常量迭代器,用于遍历多重集合. (迭代器和const_iterator是相同的类型。 |
| reverse_iterator | 可逆容器 | 迭代器,用于反向遍历多重集合. |
| const_reverse_iterator | 可逆容器 | 常量迭代器,用于反向遍历多重集合. (反向迭代器和const_reverse_iterator是相同的类型。 |
| iterator begin() const | 容器 | 返回一个iterator指向多重集合开头的迭代器。多重集合. |
| iterator end() const | 容器 | 返回一个iterator指向多重集合结尾的迭代器。多重集合. |
| reverse_iterator rbegin() const | 可逆容器 | 返回一个reverse_iterator指向反转多重集合开头的迭代器。 |
| reverse_iterator rend() const | 可逆容器 | 返回一个reverse_iterator指向反转多重集合结尾的迭代器。 |
| size_type size() const | 容器 | 返回多重集合. |
| size_type max_size() const | 容器 | 返回多重集合. |
| bool empty() const | 容器 | true如果多重集合的大小为0. |
| key_compare key_comp() const | 排序关联容器 | 返回key_compare对象,该对象由多重集合. |
| value_compare value_comp() const | 排序关联容器 | 返回value_compare对象,该对象由多重集合. |
| multiset() | 容器 | 创建一个空多重集合. |
| multiset(const key_compare& comp) | 排序关联容器 | 创建一个空多重集合,使用comp作为key_compare对象。 |
template <class InputIterator> multiset(InputIterator f, InputIterator l) [1] |
多个排序关联容器 | 创建一个包含范围副本的多重集合。 |
template <class InputIterator> multiset(InputIterator f, InputIterator l, const key_compare& comp) [1] |
多个排序关联容器 | 创建一个包含范围副本的多重集合,使用comp作为key_compare对象。 |
| multiset(const multiset&) | 容器 | 复制构造函数。 |
| multiset& operator=(const multiset&) | 容器 | 赋值运算符。 |
| void swap(multiset&) | 容器 | 交换两个多重集合的内容。 |
| iterator insert(const value_type& x) | 多个关联容器 | 插入x到多重集合. |
iterator insert(iterator pos,
const value_type& x)
|
多个排序关联容器 | 插入x到多重集合,使用pos作为插入位置的提示。 |
template <class InputIterator> void insert(InputIterator, InputIterator) [1] |
多个排序关联容器 | 将范围插入到多重集合. |
| void erase(iterator pos) | 关联容器 | 删除pos. |
| size_type erase(const key_type& k) | 关联容器 | 删除键为k. |
| void erase(iterator first, iterator last) | 关联容器 | 删除范围内的所有元素。 |
| void clear() | 关联容器 | 删除所有元素。 |
| iterator find(const key_type& k) const | 关联容器 | 查找键为k. |
| size_type count(const key_type& k) const | 关联容器 | 统计键为k. |
| iterator lower_bound(const key_type& k) const | 排序关联容器 | 查找第一个键不小于k. |
| iterator upper_bound(const key_type& k) const | 排序关联容器 | 查找第一个键大于k. |
pair<iterator, iterator> equal_range(const key_type& k) const |
排序关联容器 | 查找包含所有键为k. |
bool operator==(const multiset&,
const multiset&)
|
前向容器 | 测试两个多重集合是否相等。这是一个全局函数,而不是成员函数。 |
bool operator<(const multiset&,
const multiset&)
|
前向容器 | 字典序比较。这是一个全局函数,而不是成员函数。 |
[1] 此成员函数依赖于成员模板函数,目前(1998 年初)并非所有编译器都支持。如果您的编译器支持成员模板,您可以使用任何类型的 输入迭代器 调用此函数。但是,如果您的编译器还不支持成员模板,那么参数必须是const value_type*类型或multiset::const_iterator.