构造函数
std::set<std::string> myset;
这条指令将会创建一个空的set容器
该容器会默认采用std::less< T >的排序规则对成员进行排序。
这种排序方法适用于内置的数据类型,比如整型、浮点型、字符串等等。
std::set<std::string> myset{"java","stl","python"};
如此同样可以进行创建,同时会对添加进入的成员进行排序和去重
set<string> copyset(myset);
set也支持拷贝构造,同样也是一个强拷贝函数,将value值全部复制到新的容器中。
自定义排序和去重方式
当模板类型是结构体等的时候就需要用到自定义排序方式了。不然就会报错。
可以通过重载运算符<或()的方式实现,以下介绍重载运算符<的实现方法;
首先,重载**只能是重载<**而不能是<=、>=等运算符,几乎所有的方法或容器都需要排序来满足数学意义上的严格弱序化,否则这些方法或容器的行为将不可预知。
set容器在插入新的值的时候,将会进行比较和去重。当a<b并且b<a均不成立的时候说明a==b此时就不可以进行插入操作。以此保证去重的操作。
eg:
其他常用函数
成员方法 | 功能 |
---|---|
begin() | 返回指向容器中第一个(注意,是已排好序的第一个)元素的双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
end() | 返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
rbegin() | 返回指向最后一个(注意,是已排好序的最后一个)元素的反向双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。 |
rend() | 返回指向第一个(注意,是已排好序的第一个)元素所在位置前一个位置的反向双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。 |
find(val) | 在 set 容器中查找值为 val 的元素,如果成功找到,则返回指向该元素的双向迭代器;反之,则返回和 end() 方法一样的迭代器。另外,如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
lower_bound(val) | 返回一个指向当前 set 容器中第一个大于或等于 val 的元素的双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
upper_bound(val) | 返回一个指向当前 set 容器中第一个大于 val 的元素的迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。(效果和lower_bound())差不多 |
empty() | 若容器为空,则返回 true;否则 false。 |
size() | 返回当前 set 容器中存有元素的个数。 |
insert() | 向 set 容器中插入元素。 |
erase() | 删除 set 容器中存储的元素。 |
swap() | 交换 2 个 set 容器中存储的所有元素。这意味着,操作的 2 个 set 容器的类型必须相同。 |
clear() | 清空 set 容器中所有的元素,即令 set 容器的 size() 为 0。 |
emplace() | 在当前 set 容器中的指定位置直接构造新元素。其效果和 insert() 一样,但效率更高。 |
emplace_hint() | 在本质上和 emplace() 在 set 容器中构造新元素的方式是一样的,不同之处在于,使用者必须为该方法提供一个指示新元素生成位置的迭代器,并作为该方法的第一个参数。 |
count(val) | 在当前 set 容器中,查找值为 val 的元素的个数,并返回。注意,由于 set 容器中各元素的值是唯一的,因此该函数的返回值最大为 1。因此可以用在一个假find() |
insert()函数是有一个返回指的。
他的返回值是一个pair类型,pair的第一个值是一个指向插入元素的迭代器。
第二个值是一个布尔类型,他代表是否成功插入(若此前存在插入值就会插入失败)
emplace()方法的语法格式如下
template <class ...Args>
pair<iterator,bool> emplace (Args&&... args);
其中,参数(Args&&… args)指的是,只需要传入构建新元素所需要的数据即可,该方法可以自行利用这些数据构建出要添加的元素。
multiset
和set容器的区别在于,multiset容器中可以同时存储多个键相同的键值对,也就是说,它没有去重的功能。
此外multiset的函数方法和set的一样。