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中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。