STL中set用法详解
- 格式:doc
- 大小:24.00 KB
- 文档页数:3
STL的基本操作指令list :Lists将元素按顺序储存在链表中. 与向量(vectors)相⽐, 它允许快速的插⼊和删除,但是随机访问却⽐较慢. assign() 给list赋值back() 返回最后⼀个元素begin() 返回指向第⼀个元素的迭代器clear() 删除所有元素empty() 如果list是空的则返回trueend() 返回末尾的迭代器erase() 删除⼀个元素front() 返回第⼀个元素get_allocator() 返回list的配置器insert() 插⼊⼀个元素到list中max_size() 返回list能容纳的最⼤元素数量merge() 合并两个listpop_back() 删除最后⼀个元素pop_front() 删除第⼀个元素push_back() 在list的末尾添加⼀个元素push_front() 在list的头部添加⼀个元素rbegin() 返回指向第⼀个元素的逆向迭代器remove() 从list删除元素remove_if() 按指定条件删除元素rend() 指向list末尾的逆向迭代器resize() 改变list的⼤⼩reverse() 把list的元素倒转size() 返回list中的元素个数sort() 给list排序splice() 合并两个listswap() 交换两个listunique() 删除list中重复的元素String类:1) string s; //⽣成⼀个空字符串s2) string s(str) //拷贝构造函数⽣成str的复制品3) string s(str,index) //将字符串str内“始于位置index”的部分当作字符串的初值4) string s(str,index, n) //将字符串str内“始于index且长度顶多n”的部分作为字符串的初值5) string s(cstr) //将C字符串作为s的初值6) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。
stl中set的用法STL(标准模板库)是C++中广泛使用的库,其中的Set容器类提供了一种无序、唯一元素的集合。
Set是由红黑树(一种自平衡二叉搜索树)实现的,因此能够在O(log n)的时间复杂度内执行插入、删除和搜索操作。
下面将介绍STL中Set 的用法。
1. 包含头文件在使用Set之前,需要包含头文件<set>。
```cpp#include <set>```2. 声明Set容器可以通过以下语法来声明一个Set容器并进行初始化:```cppstd::set<数据类型> set_name;```例如,我们可以声明一个存储整数的Set容器:```cppstd::set<int> mySet;```3. 插入元素可以使用insert()函数向Set容器中插入元素。
Set容器将自动维护元素的顺序和唯一性。
```cppmySet.insert(value);```例如,向mySet中插入整数值10:```cppmySet.insert(10);```4. 删除元素可以使用erase()函数从Set容器中删除指定值的元素。
```cppmySet.erase(value);```例如,删除mySet中的整数值10:```cppmySet.erase(10);```5. 遍历Set容器可以使用迭代器来遍历Set容器中的元素。
```cppfor (auto it = mySet.begin(); it != mySet.end(); ++it) {// 使用 *it 访问当前元素的值}```例如,遍历输出mySet中的所有元素:```cppfor (auto it = mySet.begin(); it != mySet.end(); ++it) {std::cout << *it << " ";}```6. 检查元素是否存在可以使用count()函数来检查Set容器中是否存在指定值的元素。
list set方法
list的set方法能将指定的元素替换某个位置的值。
list的set方法有3个参数,分别为要替换的索引位置、替换的值以
及本来应该在索引位置上的值。
list的set方法是实现赋值操作的最快、最简单的方法,它能够使用索引来替换某个位置上的值。
它与list的append方法及insert
方法不同,set方法可以实现将某个位置上的元素替换成新值后,list 中原本存在的值不会改变,而会把新给定的值放到指定位置上。
list的set方法可以用于多种情况,比如在一个循环中,可以跟踪元素的变化,获得最新的元素,从而实现不断更新list中元素的值。
list的set方法也能用来重新更新list中某个位置上的值,这
是很好的替换操作,也比insert方法替换更快。
可以说,list的set
方法是进行替换操作的首选。
list的set方法尽管简单、有效,但使用它也要严格遵守公式,比如当要替换的元素范围超出了list的实际位置索引范围时,set方
法会报错,因此在使用set方法时要确认被替换的元素范围合理。
总的来说,list的set方法是一种好的赋值操作,它能够通过指定的索引位置,快捷地将某个位置上的值替换成新的值,且原来的其
它值不会改变,也能够实现list中元素变动后,给出最新元素的功能。
在使用set方法时,要注意将范围控制在正确的索引位置内。
1、常⽤C++STL--------集合集合⼀、集合中常见操作函数1、集合的组成集合是由不重复元素组成的,例如{1,2,3},就是由数据1、2、3组成的集合2、集合头⽂件#include<set>using namespace std;3、集合的定义C++定义⼀个集合的语句是:set<T> s,定义了⼀个名为s,存储数据类型为T的集合,初始是空集合,我们可以定义set<int> a,set<string> aa等等4、集合插⼊元素set 使⽤insert向集合中插⼊⼀个新元素,如果元素已经存在,那么这个插⼊是⽆效的,因为集合中不存在重复元素;#include<set>using namespace std;int main(){set<string> country; //{}country.insert("china"); //{"china"}country.insert("American"); //{"china","American"}country.insert("china"); {"china","American"}; //“China”插⼊⽆效return0;}5、集合删除元素集合set使⽤erase从集合中删除⼀个元素,如果集合中不存在这个元素,则不进⾏任何操作#include<set>using namespace std;int main(){set<string> country; //{}country.insert("china"); //{"china"}country.insert("American"); //{"china","American"}country.erase("china"); //{"American";country.erase("china"); //删除“china”⽆效,因为集合中不存在这样的元素return0;}6、集合判断元素是否存在C++如果你想判断⼀个元素是否在集合中存在,可以使⽤count函数,存在返回1,不存在返回0#include<set>using namespace std;int main(){set<string> country; //{}country.insert("china"); //{"china"}country.insert("American"); //{"china","American"}if(country.count("china")){ //判断“china”是否属于countrycout << "china belong to country " << endl;}return0;}7、集合迭代器C++可以通过迭代器来访问各个元素,迭代器的写法是:set<T>::iterator it定义了⼀个指向set<T>的迭代器it,其中T是任意数据类型,::iterator是固定类型begin函数返回容器中起始元素的迭代值,end函数返回容器中尾部元素的迭代值通过*操作可以获取指定的元素,通过++可以获取下⼀个元素,--可以获取上⼀个元素注意:使⽤集合内部是⼀个按照从⼩到⼤有序的状态,所以迭代器在输出的时候是⼀个有序序列#include<set>#include<string>#include<iostream>using namespace std;int main(){set<string> country; //{}country.insert("china"); //{"china"}country.insert("American"); // {"china","American"}for(set<string>::iterator it = country.begin();it != country.end();it++){cout << *it << endl; //通过迭代器输出对象}return0;}8、清空集合内存和元素C++中调⽤clear()函数就可以清空集合元素,同时清空set占⽤的内存C++中调⽤size()函数就可以获取集合元素的个数9、定义重载⼩于的结构体1struct Node{2int x,y;3bool operator<(const Node &rhs) const{ //函数名:operator< rhs:右操作数,定义为⼀个const引⽤运算符重载定义在结构体内部,左操作数就调⽤operator<的对象最后的const函数表⽰不能对其数据成员进⾏修改,同时const对象只能调⽤const成员函数4if(x == rhs.x){5return y < rhs.y;6 }else{7return x < rhs.x;8 }9 }//上⾯重载定义的排序函数,按照x从⼩到⼤排,x相等的时候,按照y从⼩到⼤排。
set是什么功能Set是一种无序且不重复的数据结构,可以存储多个不同元素的集合。
在编程中,Set可以用于去除重复元素、判断元素是否存在以及进行集合运算等功能。
首先,Set可以用于去除重复元素。
当我们需要对一个列表或者数组进行去重操作时,可以将其转化为Set,去掉重复元素后再转回为列表或数组。
这样可以简洁高效地去除重复元素,提高程序的运行效率。
其次,Set可以用于判断元素是否存在。
Set中的元素是无序的,但是对于某个元素,我们可以快速地判断它是否存在于Set中。
这个功能在处理大量数据时非常有用,比如判断某个用户是否已经存在于一个用户列表中。
另外,Set可以进行集合运算。
我们可以对两个Set进行并集、交集、差集和对称差集等操作,得到两个集合的一些特定关系。
这样可以方便处理两个数据集之间的关系,比如比较两个用户的兴趣爱好,找出共同喜欢的项目等。
此外,Set还可以用于快速查找最大值、最小值等操作。
通过将需要查找的数据存放在Set中,可以利用Set的无序性质,快速找到最大值、最小值,而无需遍历整个数据集。
另一个重要的功能是Set可以用于实现数学中的集合运算,比如求并集、交集、差集和对称差集等。
这些集合运算在数据分析和处理中经常用到,可以方便地实现对数据的统计和处理。
在编程中,Set还可以用于实现许多其他的功能,比如实现队列、栈等数据结构。
通过使用Set,可以高效地实现这些数据结构,并且能够满足不同的需求。
总之,Set作为一种无序且不重复的数据结构,可以实现多种功能,如去除重复元素、判断元素是否存在、进行集合运算等。
它在编程中有着广泛的应用,可以提高程序的运行效率,方便处理数据集合,并且可以实现其他数据结构的功能。
关于STL中set容器的⼀些总结C++ STL 之所以得到⼴泛的赞誉,也被很多⼈使⽤,不只是提供了像vector, string, list等⽅便的容器,更重要的是STL封装了许多复杂的数据结构算法和⼤量常⽤数据结构操作。
vector封装数组,list封装了链表,map和set封装了⼆叉树等,在封装这些数据结构的时候,STL按照程序员的使⽤习惯,以成员函数⽅式提供的常⽤操作,如:插⼊、排序、删除、查找等。
让⽤户在STL使⽤过程中,并不会感到陌⽣。
关于set,必须说明的是set关联式容器。
set作为⼀个容器也是⽤来存储同⼀数据类型的数据类型,并且能从⼀个数据集合中取出数据,在set中每个元素的值都唯⼀,⽽且系统能根据元素的值⾃动进⾏排序。
应该注意的是set中数元素的值不能直接被改变。
C++ STL中标准关联容器set, multiset, map, multimap内部采⽤的就是⼀种⾮常⾼效的平衡检索⼆叉树:红⿊树,也成为RB树(Red-Black Tree)。
RB树的统计性能要好于⼀般平衡⼆叉树,所以被STL选择作为了关联容器的内部结构。
(1)为何map和set的插⼊删除效率⽐⽤其他序列容器⾼?⼤部分⼈说,很简单,因为对于关联容器来说,不需要做内存拷贝和内存移动。
说对了,确实如此。
set容器内所有元素都是以节点的⽅式来存储,其节点结构和链表差不多,指向⽗节点和⼦节点。
结构图可能如下: A / \ B C / \ / \D E F G因此插⼊的时候只需要稍做变换,把节点的指针指向新的节点就可以了。
删除的时候类似,稍做变换后把指向删除节点的指针指向其他节点也OK了。
这⾥的⼀切操作就是指针换来换去,和内存移动没有关系。
(2)为何每次insert之后,以前保存的iterator不会失效?iterator这⾥就相当于指向节点的指针,内存没有变,指向内存的指针怎么会失效呢(当然被删除的那个元素本⾝已经失效了)。
set集合详解集合是一种抽象的数据结构,它把一组不同的数据组合在一起,以便分类和操作,在计算机科学中被用于表示不可预见的数据类型。
Set集合是一种特殊的集合,是一个没有重复元素的无序的集合。
不仅可以在集合中添加元素,还可以从集合中删除元素,并且可以对集合中的元素进行操作,如检查元素是否包含在集合中,比较两个集合的元素,以及进行集合的合并和分割等。
大多数编程语言都支持集合,C/C++语言实现的集合类似于一个数组,可以添加、删除、查找和更新元素。
而Java Script则支持Set集合,这是一种特殊的集合,可以添加和删除元素,还可以查找和更新元素。
它允许一个值只出现在集合中一次,即集合中不能出现重复的值。
Set集合主要用于元素去重,处理多重集合,进行数学计算等。
集合的操作有着不同的计算复杂度,如添加和删除的复杂度为O(1);遍历的复杂度为O(n);查找的复杂度为O(n);合并和分割的复杂度为O(n^2);检查元素是否包含在集合中的复杂度为O(1);比较两个集合的复杂度为O(n^2)。
除了集合自身的操作之外,还可以对多重集合进行组合和数学计算。
最常用的多重集合有并集、交集、补集、差集等,它们都是Set 集合的操作,也就是把一组集合合并成新的集合,比如将两个集合A 和B的并集计算出新的集合C,它包含A和B中的所有元素。
而Set集合的数学计算可以用来处理集合的关系,比如比较两个集合的关系,判断一个集合是另一个集合的子集等,这些都是Set集合提供的常用功能。
总而言之,Set集合是一种特殊的集合,它可以去重,处理多重集合,进行数学计算,以及比较集合之间的关系。
从理论上讲,对于Set集合的操作来说,时间复杂度是相对较低的,因此它可以实现较快的操作效率。
Set集合的应用场景包括去重,处理多重集合,数学计算,以及比较集合之间的关系。
它的使用也让程序的操作更加简单,更加方便,使得程序的效率大大提高。
STEP7中用STL编写程序的时候,对SET 的用法理解不够,帮忙看看下。
SET
=DB1.DBX0.1
和
SET
SDB1.DBX0.1
有什么区别?
自己感觉没什么区别,结果都是DB1.DBX0.1为1,大家点拨下,这2种写法有什么不一样?对结果有什么改变没。
最佳答案
首先,就你所说的这两段代码来讲,DB1.DBX0.1都为1,所产生的结果都是一样的,对结果没有区别。
但是我想还是着重从两个方面理解一下这一块的知识:
1.SET,作用是将RLO无条件置位1,也就是无条件将RLO=1.
2.再就是对S(置位指令)和=(赋值指令)的区别进行理解。
置位(S):如果前一条指令将RLO置为1,那么S指令
将寻址触点或线圈的信号状态置1.
赋值(=):与RLO的状态无关,=指令把逻辑操作结果的值赋给其寻址单元(触点或线圈).
分析两段代码:
SET//将RLO置为1
=DB1.DBX0.1//将逻辑操作结果RLO的值赋DB1.DBX0.1
SET//将RLO置为1
SDB1.DBX0.1//因为上一条指令RLO=1所以将
//DB1.DBX0.1置为1
如果单单得到DB1.DBX0.1的结果,那么没有区别,都是1;但是真正是如何得到的这个1,和表示的意义的话,还是有区别的。
就SET而言很好理解,就是无条件将RLO=1。
以上结论根据《S7-300.400语句表编程参考手册》5.7~5.9节。
STL中map、set的数据结构及底层实现摘要:本文列出几个基本的STL map和STL set的问题,通过解答这些问题讲解了STL关联容器内部的数据结构,最后提出了关于UNIX/LINUX自带平衡二叉树库函数和map, set 选择问题,并分析了map, set的优势之处。
对于希望深入学习STL和希望了解STL map 等关联容器底层数据结构的朋友来说,有一定的参考价值。
vector(向量)——STL中标准而安全的数组。
只能在vector 的“前面”增加数据。
deque(双端队列double-ended queue)——在功能上和vector相似,但是可以在前后两端向其中添加数据。
list(列表)——游标一次只可以移动一步。
如果你对链表已经很熟悉,那么STL中的list 则是一个双向链表(每个节点有指向前驱和指向后继的两个指针)。
set(集合)——包含了经过排序了的数据,这些数据的值(value)必须是唯一的。
map (映射)——经过排序了的二元组的集合,map中的每个元素都是由两个值组成,其中的key(键值,一个map中的键值必须是唯一的)是在排序或搜索时使用,它的值可以在容器中重新获取;而另一个值是该元素关联的数值。
比如,除了可以ar[43] = "overripe"这样找到一个数据,map还可以通过ar["banana"] = "overripe"这样的方法找到一个数据。
如果你想获得其中的元素信息,通过输入元素的全名就可以轻松实现。
multiset(多重集)——和集合(set)相似,然而其中的值不要求必须是唯一的(即可以有重复)。
multimap(多重映射)——和映射(map)相似,然而其中的键值不要求必须是唯一的(即可以有重复)。
STL map和set的使用虽不复杂,但也有一些不易理解的地方,如:# 为何map和set的插入删除效率比用其他序列容器高?# 为何每次insert之后,以前保存的iterator不会失效?# 为何map和set不能像vector一样有个reserve函数来预分配数据?# 当数据元素增多时(10000到20000个比较),map和set的插入和搜索速度变化如何?或许有得人能回答出来大概原因,但要彻底明白,还需要了解STL的底层数据结构。
数据库中set的用法在数据库中,SET是一种用于存储一组不重复值的数据类型。
它可以存储最多64个成员的列表,并且不允许重复的值。
SET数据类型可以用于表示从一组选项中选择一个或多个选项的情况。
SET类型的字段可以存储多个值,每个值之间用逗号分隔。
使用SET类型的字段,可以将一列的值限制为从预定义的值集合中选择,因此可以有效地约束数据的输入范围。
下面是一些SET类型的使用注意事项和拓展:1. SET列的定义:在创建表时,SET类型的列可以定义为SET('val1','val2','val3'...),其中val1、val2、val3等为允许的选项。
例如,CREATE TABLE my_table (id INT, optionsSET('val1','val2','val3'));2.设置和获取SET字段的值:可以使用SET语句或UPDATE语句来设置SET字段的值,如SET options = 'val1,val2'或UPDATEmy_table SET options = 'val1,val2' WHERE id = 1。
获取SET字段的值可以直接查询该字段,例如SELECT options FROM my_table WHERE id = 1。
3.查询SET字段的值:可以使用FIND_IN_SET函数来查询包含特定选项的记录,例如SELECT * FROM my_table WHEREFIND_IN_SET('val1', options) > 0。
4. SET字段的限制:SET类型的字段在存储时会自动去重,不会存储重复的元素。
同时,SET字段的长度限制为最多64个成员。
5. SET字段的扩展:SET类型虽然在某些情况下非常有用,但也有一些限制。
PLC编程中的STL是什么PLC厂家设计了专门用于编制顺序控制程序的指令和编程元件。
其中,STL为步进梯形指令(Step Ladder Instruction)。
SET:置位,使触点闭合。
RET:复位,使之断开。
使用STL指令时应该注意以下一些问题:1)与STL触点相连的触点应使用LD或LDI指令,即LD点移到STL触点的右侧,直到出现下一条STL指令或出现RET指令,RET指令使LD点返回左侧母线。
各个STL触点驱动的电路一般放在一起,最后一个电路结束时—定要使用RET指令。
2)STL触点可以直接驱动或通过别的触点驱动Y、M、S、T等元件的线圈,STL触点也可以使Y、M、S等元件置位或复位。
3)STL触点断开时,CPU不执行它驱动的电路块,即CPU只执行活动步对应的程序。
在没有并行序列时,任何时候只有一个活动步,因此大大缩短了扫描周期。
4)由于CPU只执行活动步对应的电路块,使用STL指令时允许双线圈输出,即同一元件的几个线圈可以分别被不同的STL触点驱动。
实际上在一个扫描周期内,同一元件的几条OUT 指令中只有一条被执行。
5)STL指令只能用于状态寄存器,在没有并行序列时,一个状态寄存器的STL触点在梯形图中只能出现一次。
6)STL触点驱动的电路块中不能使用MC和MCR指令,但是可以使用CJP和EJP指令。
当执行CJP指令跳人某一STL触点驱动的电路块时,不管该STL触点是否为“1”状态,均执行对应的EJP指令之后的电路。
7)与普通的辅助继电器一样,可以对状态寄存器使用LD、LDI、AND、ANI、OR、ORI、SET、RST、OUT等指令,这时状态器触点的画法与普通触点的画法相同。
8)使状态器置位的指令如果不在STL触点驱动的电路块内,执行置位指令时系统程序不会自动将前级步对应的状态器复位。
Set是英语里常用的单词,意为“集合”,在日常生活和数学中都有广泛应用。
本文将介绍Set的用法,希望能给读者带来一些启示。
一、Set是什么?Set是英语里的一个名词,指代一个集合,可以包含不同的元素。
Set也可以是一个动词,表示设置某些参数或值。
Set是数学中的基础概念之一,有着广泛的应用。
二、Set的数学用法在数学中,Set指代一个由若干个元素构成的集合。
例如,{1,2,3}就是一个包含3个元素的Set。
Set有许多特殊的操作,如求交集、并集等等。
Set的运算也有着特定的符号,如∩表示交集,∪表示并集。
三、Set在计算机科学中的应用Set在计算机科学中常常被使用。
例如,在编程中,我们可以定义一个Set来存储某些数据,并且可以进行 add、remove、contains、size、isEmpty等等操作。
这些操作都可以在Set中找到,这样可以极大地减少了程序的复杂度。
四、Set在生活中的应用Set在日常生活中也有广泛的应用。
例如,我们可以将所有的好友组成一个Set,然后对这个Set进行各种操作,比如删除好友、添加好友、检查好友等等。
除此之外,Set还可以用来处理一些复杂的领域,比如人类基因组学。
五、Set的其他用途除了这些常见的用途以外,Set还有很多其他的用途。
例如,在音乐领域,Set可以代表一组曲目。
在拼图游戏中,Set可以指代一组拼图。
在棋类游戏中,Set可以代表一组棋子。
在图形学中,Set可以指代一个集合的点或线。
总之,Set是一个非常实用和基础的工具,具有广泛的应用。
学习Set的使用方法,可以帮助我们更好地处理一些复杂的问题。
希望读者们能够善于利用Set,创造美好的生活和工作。
set--常见成员函数及基本⽤法c++ stl集合set介绍 c++ stl集合(Set)是⼀种包含已排序对象的关联容器。
set/multiset会根据待定的排序准则,⾃动将元素排序。
两者不同在于前者不允许元素重复,⽽后者允许。
c++ stl集合set介绍c++ stl集合(Set)是⼀种包含已排序对象的关联容器。
set/multiset会根据待定的排序准则,⾃动将元素排序。
两者不同在于前者不允许元素重复,⽽后者允许。
1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插⼊新元素2) 不提供直接存取元素的任何操作函数,只能通过迭代器进⾏间接存取,⽽且从迭代器⾓度来看,元素值是常数3) 元素⽐较动作只能⽤于型别相同的容器(即元素和排序准则必须相同)set模板原型://Key为元素(键值)类型1template<class Key, class Compare=less<Key>, class Alloc=STL_DEFAULT_ALLOCATOR(Key) >从原型可以看出,可以看出⽐较函数对象及内存分配器采⽤的是默认参数,因此如果未指定,它们将采⽤系统默认⽅式。
set的各成员函数列表如下:c++ stl容器set成员函数:begin()--返回指向第⼀个元素的迭代器c++ stl容器set成员函数:clear()--清除所有元素c++ stl容器set成员函数:count()--返回某个值元素的个数c++ stl容器set成员函数:empty()--如果集合为空,返回truec++ stl容器set成员函数:end()--返回指向最后⼀个元素的迭代器c++ stl容器set成员函数:equal_range()--返回集合中与给定值相等的上下限的两个迭代器c++ stl容器set成员函数:erase()--删除集合中的元素c++ stl容器set成员函数:find()--返回⼀个指向被查找到元素的迭代器c++ stl容器set成员函数:get_allocator()--返回集合的分配器c++ stl容器set成员函数:insert()--在集合中插⼊元素c++ stl容器set成员函数:lower_bound()--返回指向⼤于(或等于)某值的第⼀个元素的迭代器c++ stl容器set成员函数:key_comp()--返回⼀个⽤于元素间值⽐较的函数c++ stl容器set成员函数:max_size()--返回集合能容纳的元素的最⼤限值c++ stl容器set成员函数:rbegin()--返回指向集合中最后⼀个元素的反向迭代器c++ stl容器set成员函数:rend()--返回指向集合中第⼀个元素的反向迭代器c++ stl容器set成员函数:size()--集合中元素的数⽬c++ stl容器set成员函数:swap()--交换两个集合变量c++ stl容器set成员函数:upper_bound()--返回⼤于某个值元素的迭代器c++ stl容器set成员函数:value_comp()--返回⼀个⽤于⽐较元素间的值的函数常⽤操作:1.元素插⼊:insert()2.中序遍历:类似vector遍历(⽤迭代器)3.反向遍历:利⽤反向迭代器reverse_iterator。
set语句用法
"set"语句通常用于以下几种情况:
1. 声明集合变量:使用"set"关键字声明一个集合变量,并使用大括号表示集合中的元素。
例如:`set<int> mySet = {1, 2, 3};`
2. 插入元素:使用"insert"函数将元素插入到集合中。
例如:`mySet.insert(4);`
3. 删除元素:使用"erase"函数删除集合中的元素。
例如:
`mySet.erase(3);`
4. 查找元素:使用"find"函数查找集合中的元素,并返回一个迭代器。
例如:`auto it = mySet.find(2);`
5. 遍历集合:使用"for-each"循环遍历集合中的所有元素。
例如:
```
for (const auto& element : mySet) {
// 使用element进行操作
}
```
6. 获取集合大小:使用"size"函数获取集合中元素的数量。
例如:`int size = mySet.size();`
需要注意的是,集合中的元素是唯一的,不允许重复。
另外,集合中的元素默认是按照特定的顺序进行排序的(一般按照元
素的大小进行升序排序),但是可以通过自定义比较函数或使用"unordered_set"来更改排序方式。
c++修改stlset中的元素set的迭代器it有const修饰符,那么对它元素的修改就必然不能成功了。
但是有时候遇到要修改stl set元素的问题,这个问题⼀般的解决⽅法是先erase这个元素,然后再insert,这样效率很低,所以得找更有效的⽅法,开始的时候编译始终通不过。
如果#include<stdio.h>#include<stdlib.h>#include<time.h>#include <map>#include <set>using namespace std;class node{public :int a ;int b;bool operator<(const node &t)const{return a < t.a;}};multiset<node>ss;int main(){node a,b,c;ss.insert(a);ss.insert(b);ss.insert(c);multiset<node>::iterator it = ss.begin(),ed = ss.end();for(;it!=ed;it++){const_cast<node*>(&(*it))->b = 10;printf("%d\n",it->b);}for(;it!=ed;it++){it->b = 11;printf("%d\n",it->b);}return0;}。
STL中set用法详解
set是STL中一种标准关联容器(vector,list,string,deque 都是序列容器,而set,multiset,map,multimap是标准关联容器),它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。
set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,支持集合的交(set_intersection),差
(set_difference) 并(set_union),对称差
(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允许重复那么可以使用
multiset#include<set>#include<iterator>#include< ;iostream>using namespace std;int
main(){set<int>eg1;//插入
eg1.insert(1);eg1.insert(100);eg1.insert(5);eg1.insert(1);//元素1因为已经存在所以set中不会再次插入
1eg1.insert(10);eg1.insert(9);//遍历set,可以发现元素是有序的set<int>::iterator set_iter=eg1.begin();cout<<"Set named eg1:"<<endl;for(;set_iter!=eg1.end();set_iter++) cout<<*set_iter<<" ";cout<<endl;//使用size()函数可以获得当前元素个数cout<<"Now there are
"<<eg1.size()<<" elements in the set
eg1"<<endl;if(eg1.find(200)==eg1.end())//find()函数可以查找元素是否存在cout<<"200 isn't in the set
eg1"<<endl;set<int>eg2;for(int
i=6;i<15;i++)eg2.insert(i);cout<<"Set named
eg2:"<<endl;for(set_iter=eg2.begin();set_iter!=eg2.end();s et_iter++) cout<<*set_iter<<"
";cout<<endl;//获得两个set的并
set<int>eg3;cout<<"Union:";set_union(eg1.begin(),e g1.end(),eg2.begin(),eg2.end(),insert_iterator<set<int> >(eg3,eg3.begin()));//注意第五个参数的形式
copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout," "));cout<<endl;//获得两个set的交,注意进行集合操作之前接收结果的set要调用clear()函数清空一下
eg3.clear();set_intersection(eg1.begin(),eg1.end(),eg2.begin(),eg 2.end(),insert_iterator<set<int>
>(eg3,eg3.begin()));cout<<"Intersection:";copy(eg3.beg in(),eg3.end(),ostream_iterator<int>(cout,"
"));cout<<endl;//获得两个set的差
eg3.clear();set_difference(eg1.begin(),eg1.end(),eg2.begin(),eg2 .end(),insert_iterator<set<int>
>(eg3,eg3.begin()));cout<<"Difference:";copy(eg3.begi
n(),eg3.end(),ostream_iterator<int>(cout,"
"));cout<<endl;//获得两个set的对称差,也就是假设两个集合分别为A和B那么对称差为AUB-A∩B eg3.clear(); set_symmetric_difference(eg1.begin(),eg1.end(),eg2.begin(),eg2 .end(),insert_iterator<set<int> >(eg3,eg3.begin())); copy(eg3.begin(),eg3.end(),ostream_iterator<int>(cout," ")); cout<<endl;return 0;}set会对元素进行排序,那么问题也就出现了排序的规则是怎样的呢?上面的示例代码
我们发现对int型的元素可以自动判断大小顺序,但是对char*就不会自动用strcmp进行判断了,更别说是用户自定义的类型了,事实上set的标准形式是set<Key, Compare, Alloc>,参数描述默认值Key集合的关键字和值的类型Compare关键字比较函数,它的参数类型key参数指定的类型,如果第一个参数小于第二个参数则返回true,否则返回falseless<Key>Allocset的分配器,用于内部内存管理alloc。