Home C&C++函数库 c++ 语法 程序源码 Linux C库

std::

set::set

公众成员函数  <set>

C++98; empty (1)
explicit set (const key_compare& comp = key_compare(),
              const allocator_type& alloc = allocator_type());
range (2)
template <class InputIterator>
  set (InputIterator first, InputIterator last,
       const key_compare& comp = key_compare(),
       const allocator_type& alloc = allocator_type());
copy (3)
set (const set& x);

构建集合

构造一个集合容器对象,根据使用的构造函数版本初始化它的内容:

C++98:
(1)空容器构造函数(默认构造函数)
构造一个空容器,没有元素。

(2)范围构造函数
构造一个容器,其中包含与范围[first,last]相同数量的元素, 每个元素都是由该范围内的相应元素放置构造的。

(3)拷贝构造函数
构造一个容器,其中包含x中每个元素的副本。
容器保留一个alloc和comp的内部副本,它们用于在容器的整个生命周期内分配存储空间和对元素进行排序。

复制构造函数(3)创建一个容器,该容器保存并使用x的分配器和比较对象的副本。

元素的存储是使用这个内部分配器分配的。


根据比较对象对元素进行排序。如果传递给构造函数的等效元素多于一个,则只保留第一个元素。

☲  参数


comp
一个二进制谓词,它接受集合中包含的两个相同类型的值, 如果第一个参数以其定义的严格弱排序在第二个参数之前, 则返回true,否则返回false。
这应该是一个函数指针或函数对象。
成员类型key_compare是容器使用的内部比较对象类型, 在set中定义为它的第二个模板形参(Compare)的别名。
如果key_compare使用默认的less(没有状态),则此参数不相关。

alloc
分配器对象。
容器保存并使用这个分配器的内部副本.
成员类型allocator_type是容器使用的内部分配器类型, 在set中定义为它的第三个模板参数(Alloc)的别名。
如果allocator_type是默认分配器(没有状态)的实例化,则忽略考虑.

first, last
输入迭代器初始和最终位置的范围。
使用的范围是[first,last),它包括first和last之间的所有元素, 包括first所指向的元素,但不包括last所指向的元素。
函数模板实参InputIterator必须是一个输入迭代器类型,该类型指向可以构造value_type对象的类型的元素。

x
另一个相同类型的集合对象(具有相同的类模板参数T、Compare和Alloc),其内容要么被复制要么被获取

il
一个initializer_list对象。
这些对象是由初始化列表声明符自动构造的。
成员类型value_type是容器中元素的类型,在 set 中定义为其第一个模板形参(T)的别名。

☣  示例



// constructing sets
#include <iostream>
#include <set>

bool fncomp (int lhs, int rhs) {return lhs<rhs;}

struct classcomp {
  bool operator() (const int& lhs, const int& rhs) const
  {return lhs<rhs;}
};

int main ()
{
  std::set<int> first;                           // empty set of ints

  int myints[]= {10,20,30,40,50};
  std::set<int> second (myints,myints+5);        // range

  std::set<int> third (second);                  // a copy of second

  std::set<int> fourth (second.begin(), second.end());  // iterator ctor.

  std::set<int,classcomp> fifth;                 // class as Compare

  bool(*fn_pt)(int,int) = fncomp;
  std::set<int,bool(*)(int,int)> sixth (fn_pt);  // function pointer as Compare

  return 0;
}

该代码不产生任何输出,但演示了构造集合容器的一些方法。

✥ 复杂度



对于空构造函数(1)和move构造函数(4)(除非alloc不同于x的分配器)是常量。
对于所有其他情况,如果元素已经按照相同的标准排序,则迭代器之间的距离为线性(复制结构)。 对于未排序的序列,在该距离内线性化(N*logN)(排序,复制构造)。

☣ 迭代器的有效性



move构造函数(4),如果元素被移动,将使所有与x相关的迭代器、指针和引用失效。

⇄ 数据竞争


访问所有复制的元素。移动构造函数(4)修改x。

☂ 异常安全性



强保证:在抛出异常的情况下没有影响。
如果元素结构的适当参数不支持allocator_traits::construct, 或者[first,last)指定的范围无效,则会导致未定义行为。

🍄  另请参阅



set::operator= 内容赋值 (公众成员函数)
set::clear 清除内容 (公众成员函数)
set::insert 插入元素 (公众成员函数)

联系我们 免责声明 关于CandCplus 网站地图