四、STL程序实例应用拓展

STL(Standard Template Library)是C++标准库的重要组成部分,它提供了一系列通用的数据结构和算法,极大地提高了C++编程的效率。本文将通过几个具体的程序实例来展示STL的应用拓展,包括容器、迭代器、算法以及函数对象的使用。

一、STL容器

STL容器是STL的基础,包括向量(Vector)、列表(List)、队列(Queue)、栈(Stack)、映射(Map)、集合(Set)等。
这些容器为数据存储和检索提供了极大的便利。

实例:使用Vector存储整数


```cpp
include
include

int main() {
// 创建一个整数向量
std::vector vec;

// 向量中添加元素
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);

// 遍历向量并打印元素
for (std::vector ::iterator it =vec.begin(); it != vec.end(); ++it) {
std::cout << it << ;
}
std::cout<< std::endl;

return 0;
}
```
二、迭代器

迭代器是STL中的核心组件之一,它允许程序员在容器内范围进行遍历操作。
迭代器类似于指针,但更加安全和通用。

实例:使用迭代器遍历Map并打印键值对


```cpp
include
include

int main() {
// 创建一个字符串到整数的映射
std::map map;
map[apple] = 1;
map[anana] = 2;
map[cherry] = 3;

// 使用迭代器遍历映射并打印键值对
for (std::map ::iterator it = map.begin(); it != map.end(); ++it) {
std::cout < first << , Value: << it->second << std::endl;
}

return 0;
}
```
三、算法

STL提供了丰富的算法,包括排序、搜索、复制、转换等。
这些算法可以与容器结合使用,极大地简化了编程工作。

实例:使用STL排序算法对向量进行排序


```cpp
include
include
include // 包含排序算法

int main() {
// 创建一个整数向量并随机填充数据
std::vector vec = {5, 2,9, 1, 5, 6};

// 使用STL排序算法对向量进行排序
std::sort(vec.begin(), vec.end());

// 打印排序后的向量
for (int i = 0; i < vec.size(); ++i) {
std::cout << vec[i] << ;
}
std::cout << std::endl;

return 0;
}
```
四、函数对象(也称为仿函数)的应用实例:使用自定义比较函数进行排序。创建一个函数对象,用于在排序时指定比较规则。例如,我们可以创建一个函数对象来按照字符串的长度进行排序。这对于处理复杂的数据类型非常有用。实例代码如下:首先定义一个函数对象,然后使用该对象对字符串向量进行排序。在排序过程中,按照字符串长度进行比较。实例代码如下:首先定义一个函数对象,然后使用该对象对字符串向量进行排序。在排序过程中,按照字符串长度进行比较。这个例子将展示如何扩展STL的使用范围以适应特定需求。定义自定义比较函数后,可以结合STL算法进行灵活应用。自定义比较函数允许我们根据实际需求调整排序规则,提高代码的可重用性和灵活性。通过创建自定义比较函数对象并将其传递给STL算法,我们可以轻松实现各种复杂的排序需求。例如,我们可以根据字符串长度进行排序,或者根据对象的某个属性进行排序等。这种灵活性使得STL成为C++编程中不可或缺的一部分。通过结合使用STL容器、迭代器、算法和函数对象等功能强大的工具,我们可以更高效地编写出高质量的程序代码实现丰富的功能。这既展示了STL的强大之处也体现了程序员利用现有库的能力提高开发效率和质量的重要方法在实际应用中通过不断地拓展和应用这些知识我们将能够更好地掌握并运用STL助力个人能力提升和专业发展文章中仅提到的部分应用并不代表着使用完全的具体情况下应当根据具体的需求和业务场景进一步研究和深入在实际项目中我们应该结合自身需要充分发挥想象力和创新能力挖掘出更多的可能性和优势无论是初学者还是经验丰富的开发者都可以从STL的应用拓展中获益匪浅随着技术的不断进步和需求的不断变化我们将不断学习和探索新的技术方法和应用场景使得我们的编程能力得到进一步提升并最终提升整个软件开发过程的效率和价值


能给几个C++中STL简单应用的例题和讲解么?

③ 第三,concept可以想成是一组合法程序。 2. 基本的Concept(所谓正规型别)① assignable 可分配的, 可归属的, 可指定的② default constructible 可默认构造的③ equality comparable 可相等比较的 3.① const iterator 所指的对象不可修改的迭代器② mutable iterator 所指的对象可以被修改的迭代器 4. refinement (精炼、强化)refinement(精炼、强化)。 如果conceptC2提供conceptC1的所有功能,再加上其他可能的额外功能,我们使说C2是C1的refinement。 5.五个iterator concepts①input iterator 缩写:InIt②output iterator 缩写:OutIt③forward iterator 缩写:FwdIt④bidirectional iterator 缩写:BidIt⑤random iterator 缩写:RanIt traits(迭代器特征)与Associate Types(相关型别)①这是为了能在算法中使用Iterator的相关型别而引入的一个中间层主要采用了三种技术A. 使用嵌套型别(这里要用到typename关键字);B. 引入中间层(增加一个类iterator_traits<I>),即所谓的iterator traits 机制;C. 使用偏特化(partial specialization),用来解决 Iterator 不是类(Iterator可能是指针)的情况及Iterator的value types 是常量等情况,这造成了iterator_traits类有以下几个版本: 针对型别为T的引数template<class _Iter> struct iterator_traits;针对型别为T*的引数template<class _Ty> struct iterator_traits<_Ty *>;针对型别为const T*的引数template<class _Ty> struct iterator_traits<const _Ty *>;②Iterator的相关型别(五个)struct iterator_traits{ // get traits from iterator _Iter //标签型别 tag type(迭代器分类型别,共有五个,它们是继承的关系) typedef typename _Iter::iterator_category iterator_category; typedef typename _Iter::value_type value_type; //差距型别 typedef typename _Iter::difference_type difference_type; typedef difference_type distance_type; // retained保留 typedef typename _Iter::pointer pointer; typedef typename _Iter::reference reference;};③自己定义的 Iterator或算法时必须支持iterator_traits.④自己定义的 Iterator类I,最简单的做法就是让I继承iterator; 7.函数对象①function call 操作符被重载 operator()②尽可能地将function object 的operator()声明为const member function③可以拥有member functions和member variables④可以没有默认构造函数 7.函数对象concepts ①无参数(Generator)f(); 单参(Unary)f(x); 双参(Binary)f(x , y);STL所定义的其它function object concepts都是这三种concepts 的refinements.② Generator有一个相关型别result_type;Unary有二个相关型别result_type, argument_type;Binary有三个相关型别result_type, first_argument_type, second_argument_type;③function object具有相关型别,但程序无须知道相关型别的名称④adaptable function object 必须定义所有相关型别,定义时可以继承STL提供的两个基类unary_function和binary_function,简化工作。 ⑤ adaptable function object是function object的refinements⑥function object作为引数传递给function adapter,则该function object必须是adaptable function object. n.谓词v.断言 缩写:pr① Predicate 是单一参数(Unary) 并返回 true 或 false 的function object;②相关型别 返回型别(bool) 引数型别 (T) 9. function adapter①adapter是这样一种东西,它能把一种接口转换成另一种接口②adaptable function object作为引数.③几乎所有的STL adapter都提供了辅助函数,这纯粹只是为了方便,因为使用function object 必须给出function object的类型,而辅助函数则无须指明.④如果需要将一般函数指针传递给function object adapter,可以利用 pointer_to_unary_function(该adapter的辅助函数为ptr_fun)等将函数转换为Adaptable Unary Function. 的提领操作:x是Iterator的实例,应该尽可能用(*x).m取代x->m,因为”->”并非广泛地被各家C++编译器所支持。 11.关于集合算法(includes ,set_union ,set_intersection,set_difference等)的一些特点:①要求引数是已排好序的区间(sorted range)②算法的输出区间(output range)一定是已排好序的③set及multiset特别满足泛型的集合算法④技巧:insert_iterator adapter可以使集合算法的输出结果安插至set之中的动作变得格外方便。 ,set,map的性质:新元素的安插并不会造成既有元素的iterators失效,从set中删除元素也不会造成任何元素的iterators失效——当然被删除的元素的iterator除外。 13. 如何将vector和string的数据传给遗留的API①vector: 如果你有一个vector对象v,而你需要得到一个指向v中数据的指针,以使得它可以被当作一个数组,只要使用&v[0]就可以了, 唯一的问题就是,如果v是空的,所以在传给API函数之前要先判断v是否为空.同时要给出v的size.②String: 对于string对象s,相应的咒语是简单的s.c_str(),即合s为空也没有问题.③注意: 不要用()代替&v[0],因为begin的返回类型是iterator,而不是一个指针. 14. :使用“交换技巧”来修整过剩容量例如: vector<Contestant> contestants; …………vector<Contestant>(contestants)(contestants); 解释:表达式vector<Contestant>(contestants)建立一个临时vector,它是contestants的一份拷贝:vector的拷贝构造函数做了这个工作。 但是,vector的拷贝构造函数只分配拷贝的元素需要的内存,所以这个临时vector没有多余的容量。 15.技巧: 使用一个类(像Lock)来管理资源的生存期线程安全和STL容器 template<typename Container> // 获取和释放容器的互斥量class Lock { // 的类的模板核心;public: // 忽略了很多Lock(const Containers container): c(container){getMutexFor(c); // 在构造函数获取互斥量}~Lock(){releaseMutexFor(c); // 在析构函数里释放它}private:const Container& c;}使用Lock类:vector<int> v;...{ // 建立新块;Lock<vector<int> > lock(v); // 获取互斥量vector<int>::iterator first5(find((), (), 5));if (first5 != ()) {*first5 = 0;}} // 关闭块,自动// 释放互斥量 心得: ①这一技巧适应大多数资源的管理.特别适合涉及线程安全及有异常发生时的资源(资源的申请与释放成对出现)管理.②使用一个类(像Lock)来管理资源的生存期,在构造函数中申请资源,在析构函数中析放资源.(关键)③为要使用的资源建立一个新的程序块,在块的开始处声明一个像Lock那样的管理资源的类变量,而且当我们不再需要该资源时就关闭那个块. (关键)④这样的办法通常称为资源获得即初始化,可以把资源的获得与释放之间的不匹配的机会减到最小.并且在异常的情况下是稳健. 16. :用empty来代替检查size()是否为0 17. 有序区间的搜索算法binary_search、lower_bound、upper_bound和equal_range在一对random access 迭代器区间上查找只花费对数次时间和对数次的比较。

STL set例子

STL set的例子

首先,我们来看一个使用C++标准模板库(STL)中的set数据结构的基本例子。 在这个程序中,我们创建了一个名为set1的整数集合,并插入了0到9的整数。 接着,尝试插入已存在的元素3,由于集合的唯一性,插入操作会失败,输出set insert failed。

接下来,程序创建了一个名为A的多集合,将set1中的元素和数组a中的元素合并。 通过多集合,我们可以轻松地合并两个集合并保持元素的顺序。

然后,我们看到一个自定义的仿函数compare,用于自定义字符串集合的排序。 我们创建了两个string集合s1和s2,分别插入一些字符串,然后分别计算它们的交集、并集、差集和对称差集。 例如,set_intersection用于找出两个集合的共同元素。

扩展资料

STL 对这个序列可以进行查找,插入删除序列中的任意一个元素,而完成这些操作的时间同这个序列中元素个数的对数成比例关系,并且当游标指向一个已删除的元素时,删除操作无效。 而一个经过更正的和更加实际的定义应该是:一个集合(set)是一个容器,它其中所包含的元素的值是唯一的。 这在收集一个数据的具体值的时候是有用的。 集合中的元素按一定的顺序排列,并被作为集合中的实例。 一个集合通过一个链表来组织,在插入操作和删除操作上比向量(vector)快,但查找或添加末尾的元素时会有些慢。 具体实现采用了红黑树的平衡二叉树的数据结构。

stl指令怎么用?

三菱plcstl指令用法:

1、STL 指令可以使编程者生成流程和工作与顺序功能图非常接近的程序。 STL 指令的意义为激活某个步(即状态),在梯形图上体现为从主母线上引出的状态接点。 STL 指令有建立子母线的功能,从而使该状态的所有操作均在子母线上进行。 步进返回指令 RET 是指状态流程结束,用于返回主母线。

2、STL触点与母线相连,与STL触点相连的起始触点应使用LD或LDI指令。 即使用STL 指令后,LD点移至STL触点的右侧,一直到出现下一条STL指令或RET指令为止。 RET指令表明整个STL程序区的结束,LD点返回原母线。 各STL触点驱动的电路一般放在一起,最后一个STL电路结束时一定要使用RET指令,否则将出现“程序错误”信息,PLC不能执行用户程序。

3、STL触点可以直接驱动或通过别的触点驱动Y、M、S、T等元件的线圈和应用指令。 STL触点右边不能使用入栈(MPS)指令。

4、STL指令不能与MC-MCR指令一起使用。

扩展资料:

STL指令注意事项:

1、OUT指令与SET指令均可用于步的活动状态的转换,使新的状态继电器置位,原状态继电器自动复位,此外还有自保持功能。 SET指令一般用于驱动目标步比当前步元件号大的状态继电器。

2、在转换条件对应的电路中,不能使用ANB,ORB,MPS,MRD和MPP指令。 可用转换条件对应的复杂电路来驱动辅助继电器,再用后者的常开触点来作转条件。

3、CPU不执行处于断开状态的STL触点驱动的电路块中的指令,在没有并行序列时,同时只有一个STL触点接通,因此使用STL指令可以显著的缩短用户程序的执行时间,提高PLC的输入、输出响应速度。

本文原创来源:电气TV网,欢迎收藏本网址,收藏不迷路哦!

相关阅读

添加新评论