STL中set用法详解
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。
STL的基本操作指令
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中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方法能将指定的元素替换某个位置的值。
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、常⽤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,可以高效地实现这些数据结构,并且能够满足不同的需求。
总之,Set作为一种无序且不重复的数据结构,可以实现多种功能,如去除重复元素、判断元素是否存在、进行集合运算等。
它在编程中有着广泛的应用,可以提高程序的运行效率,方便处理数据集合,并且可以实现其他数据结构的功能。
关于STL中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这⾥就相当于指向节点的指针,内存没有变,指向内存的指针怎么会失效呢(当然被删除的那个元素本⾝已经失效了)。
使用STL指令的PLC顺序控制编程方法
前器季 暂停 崩国坷圊 反转
sTL指令的出现意味着当前 sTL程序区的结束和新的
图l sTL指夸
sTL程序区的开始。各sTL触点驱动的电路一般放在一起,
最后一个s1L电路结束时一定要使用唧指令。RET指令
意味着最后一个sTL程序区的结束,LD点返回左侧母线。 pl:怎样对单序列蝙程? 答:旋转工作台用凸轮和限位开关来实现运动控制(见
条件同时满足。此时置位指令将后续步s21变为活动步,同
时系统程序自动地将s20复位为不活动步。需要从某一步返 回初始步时,可对初始步对
应的状态继电器使用0uT指 令或sET指令。
问.RET指争有什盖作 Jfl o
l|
正转
与sn,触点相连的触点 应使用LD或LDI指令,即LD 点移到sTL触点的右侧,该 点成为临时母线。下一条
然后压钳下行。压紧板 料后,压力继电器x4为
1状态,压钳保持压紧,剪刀开始下行。剪断扳料后,x2变
为1状态。为了提高效率,压钳和剪7J同时上行。它们分别
碰到限位开关x0和x1后,分别停止上行,均停止后,又开
始下一周期的工作。剪完lO块料后停止工作,并停留在初始
状态。
系统的顺序功能图和梯形图如图4所示,步s0是初始
问:为什幺使用sTL指令时允许双线圈电路7 答:由于cPu只执行活动步对应的sTL电路块,使用 s1L指令时允许双线圈输出,印不同的s下L触点可以分别驱 动同一编程元件的一个线圈。 问:怎样对选择序列骗程?
板料 .
作过程如n首先板料
万z72727zi广r气)(3 右行至限位开关x3处,
图3剪板机示意图
问 怎样对并行序列编程? 图4中分别由s23、s24和s25、s26组成的两个单序列 是并行工作的,设计梯形图时应保证这两个序列同时开始工 作和同时结束,即两个序列的第一步s23和s25应同时变为 括动步,两个序列的最后一步s24和s26应同时变为不活动 步。并行序列的分支的处理很简单,在图4中,当步s22是 活动步,并且转换条件x2满足时,步s23和s25同时变为活 动步。在梯形图中,当s22的sTL触点和x2的常开触点均 接通时,s23和s25被两条sET指令同时置位,系统程序将 前级步s22复位为不括动步。步s24、s26是等待步,用来同 时结束两个并行序列。图4中水平双线之下的转换条件“=r 表示转换条件总是满足的,即只要步s24、s26都是活动步, 就会发生步s24,s26到步s27的转换.步s24、s26变为不 活动步,步s27变为活动步。在梯形图中,用s24、s26的sTL 触点组成的串联电路使s27置位。如果不涉及并行序列的合 并,同一状态继电器的sTL触点只能在梯形图中使用~次, 并且只能作为电路的起始触点。串联的sTL触点的个数不能
set集合详解
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的用法理解不够,帮忙看看下。
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指令编程方法
根据系统的顺序功能图设计梯形图 的方式,称为顺序控制梯形图的编 程方式。
顺序控制梯形图的编程方式主要有:
使用STL指令的编程方式 使用起保停电路的编程方式 以转换为中心的编程方式
STL指令
FX系列PLC的步进顺控指令有两条:一条是步进触点(也叫 步进开始)指令STL,一条是步进返回(也叫步进结束)指令 RET。
STL触点串联驱动将后续步置位的指令“SET S22”。
STL指令的编程方法
1.顺序功能图中步对应某个STL触点,当某一步为活动步时,对应的STL 触点接通。
2.STL触点有三个功能:①对负载的驱动处理,②指定转换条件,③指定 转换目标。 顺序功能图中动作直接由STL触点驱动;STL触点和转换条件 串联将后续步置位(SET S22) 3.当该步后面的转换条件满足时(如X0=1)转换实现,即后续步对应的S (如S22)被SET指令置位,同时活动步对应的S(如S21)被系统程序自 动复位,对应的STL触点断开。
M8002 S0 S21 S22
S23 S24
SET S0 X4
SET S21
Y0 X3
SET S22
Y1 X1
SET S23
Y0 X2
SET S24
Y1 X0
SET S0
RET
M8002 S0 S21 S22
S23 S24
SET S0 X4
SET S21
Y0 X3
SET S22
Y1 X1
SET S23
1.STL指令STL步进触点指 Nhomakorabea用于“激活”某个状态,其梯形图符 号为
2.RET指令
RET指令用于返回主母线,其梯形图符号为
