stl之关联容器学习笔记2

set类型容器

set容器只是单纯的键的集合,其中的键必须唯一,且不能修改(const)。

举个例子:

某软件提供黑名单功能,其黑名单就可用set容器配置。在做某项操作前,先检查黑名单。

set支持大部分map的操作,有两点例外:
1、set不支持下标操作,且没有定义mapped_type。

2、set中,value_type不是pair类型,而是与key_type相同的类型。

因为只是单纯的键集合,没有关联的值。

添加元素操作

1、s.insert(v):在s中添加值为v的元素。返回一个pair类型,其组成包括一个指向新添加元素的迭代器,和一个是否成功添加元素的bool值。

2、s.insert(iter1,iter2):在s中添加iter1和iter2所组成的范围内的元素。如范围内存在重复的元素,则只添加一次。返回void。

获取元素操作

1、s.find(v):在s中搜索值为v的元素。如搜索到,则返回指向被搜索元素的迭代器。否则,返回指向超出容器末端的下一位置的迭代器。

2、s.count(v):统计s中搜索值为v的元素的个数。返回值为为元素的个数。对于set来说,返回值只有可能是0或1。

multimap和multiset

map和set中,一个键只能对应一个值(键唯一)。而在multimap和multiset中,允许一个键出现多次,也就形成了一键对应多值的结构。

例如,在电话号码本应用中,一个人(键)可能有多个电话号码(值)。

multimap和multiset使用之前必须包含头文件:

#include <map>

#include <set>

multimap和multiset所支持的操作,于map和set操作相同。只有一个例外:multimap不支持下标操作,这也是合理的,因为某个键可能对应多个值。

添加与删除元素

可直接调用insert和erase操作,基于一键对多值的结构,会有一些变化,考虑下面的例子:

multimap<string,int> si_mmap;

si_mmap.insert(make_pair(string("haha"),1));

si_mmap.insert(make_pair(string("haha"),2));

由于键不要求唯一,则每次调用insert总会添加一个元素。以上的例子,对于haha键来说,有两个值,1和2。

对应的,参数为一个键的删除操作,会删除拥有该键的所有元素,考虑以下的例子:

multimap<string,int>::size_type cnt;
cnt=si_mmap.erase("haha");

这将返回被删除元素的个数。在本例中,cnt的值为2。

当然也会有参数为一个或一对迭代器的版本,对于这个版本,只删除被指向的元素(或范围内的元素)。

查找元素

map和set中的元素是顺序存储的,而multimap和multiset也一样。因此,如果在容器中某个键对应多个值,则这些值是相邻着存放的。这也就意味着,在用迭代器遍历容器时,会依次返回特定键关联的所有元素。

在map和set中查找一个元素很容易,要么在,要么不在。而在multimap和multiset中,就比较复杂,因为一键可能对应多值。

为了解决这一问题。有三种可行的方案。

1、使用find和count。考虑以下的例子:

string search_item("haha");

typedef multimap<string,int>::size_type sz_type;

sz_type num=si_mmap.count(search_item);//获取容器中,键为search_item的元素的个数

multimap<string,int>::iterator iter=si_mmap.find(search_item);//获取指向第一个键为search_item的元素的迭代器

for(sz_type cnt=0;cnt!=num;++cnt,++iter)

    cout <<iter->second <<endl;

以上的例子中,关键的一点在于,如果在容器中某个键对应多个值,则这些值是相邻着存放的。


2、使用lower_bound和upper_bound函数

这是两个关联容器的操作

lower_bound参数为一个键,返回一个迭代器,指向键不小于k的第一个元素。

upper_bound参数为一个键,返回一个迭代器,指向键大于k的第一个元素。

如使用同一个键调用以上两个函数,则返回了一个迭代器范围,这个范围恰好就是指定的键对应的所有值的范围。

我们用这两个函数重写上面的例子:

typedef multimap<string,int>::iterator mm_iter;

//以下两个操作获取迭代器对

mm_iter beg=si_mmap.lower_bound(search_item);

mm_iter end=si_mmap.upper_bound(search_item);

while(beg!=end)

{

  cout <<beg->second <<endl;

  ++beg;

}


3、使用equal_range函数

这个函数使用一个键作为参数,返回一个pair类型,由lower_bound和upper_bound的返回值组成。

由以上的定义,我们可以写出更简洁的代码,重写以上的例子:

pair<mm_iter,mm_iter> pos=si_mmap.equal_range(search_item);

while(pos.first!=pos.second)

{

   cout <<pos.first->second <<endl;

   ++pos.first;

}

已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 在信息技术领域,特别是软件编程行业,微软公司推出的集成开发环境(IDE)Visual Studio,凭借其卓越的功能和广泛的适用范围,成为了众多程序员的常用工具。不过,在实际操作期间,用户可能会遭遇各种挑战,其中一种较为普遍的挑战是“Visual Studio遭遇了异常情况,这或许与某个附加组件有关”。本文将详细研究这一现象的成因、潜在后果以及最终的应对措施。 ### 原因剖析 Visual Studio通过支持多种插件和附加组件来扩展其功能,这些组件通常由第三方开发者设计,旨在为用户提供更多个性化和专业化的工具。然而,这些插件的质量良莠不齐,部分可能未经过充分的测试或与特定版本的Visual Studio存在兼容性难题,从而在执行时引发异常。异常的出现可能源于以下几个因素: 1. **代码缺陷**:若附加组件中的代码存在逻辑问题或资源管理不当,就可能导致运行时异常。 2. **资源竞争**:多个插件同时占用相同的资源(例如内存、文件句柄等),可能会产生资源冲突,进而触发异常。 3. **依赖不匹配**:插件可能需要特定版本的库或框架,如果系统中安装的版本不一致,也可能导致异常。 4. **安全隐患**:部分插件可能存在安全漏洞,一旦被恶意利用,可能会导致更严重的问题,包括但不限于异常崩溃。 ### 后果分析 当Visual Studio遇到由附加组件引发的异常时,不仅会中断当前的工作进程,降低开发效能,还可能带来以下潜在风险: 1. **数据遗失**:若异常发生在保存操作之前,可能会导致未保存的工作内容遗失。 2. **稳定性减弱**:频繁的异常会导致Visual Stud...
内容概要:本文围绕有源中点箝位(ANPC)三电平并网逆变器,提出并深入研究了一种融合双极性倍频脉宽调制(DPWMA)、正负序分离锁相控制与电网电压前馈控制的高性能一体化并网策略。研究首先系统分析了ANPC三电平逆变器在开关损耗均衡、中点电位稳定、输出谐波含量低等方面的拓扑结构优势,为实现高质量并网奠定了坚实的硬件基础。在此基础上,通过引入DPWMA调制策略,有效提升了等效开关频率,显著优化了输出电压电流的波形质量,降低了谐波畸变。为应对电网电压不平衡、畸变等复杂工况,研究采用了正负序分离锁相技术,实现了对电网正序和负序分量的精确分离与独立控制,从而保障了在非理想电网条件下的精准相位同步。同时,通过叠加电网电压前馈控制,构建了前馈-反馈复合控制体系,提前补偿电网扰动,极大地增强了系统的动态响应速度和抗干扰能力。最终,通过Simulink仿真平台对稳态、电网不平衡及动态扰动等多种工况进行了全面验证,结果表明该复合控制策略能显著提升并网系统的电能质量、稳定性和工况适应性,为新能源发电等大功率并网应用提供了先进的技术解决方案。; 适合人群:具备电力电子、自动控制理论或新能源并网技术等相关专业知识背景,从事相关领域科研或工程开发工作的研究人员,尤其适合高校研究生、青年教师及电力系统仿真与设计工程师。; 使用场景及目标:①应用于对电能质量要求严苛的大功率并网逆变器控制系统设计与优化;②解决电网电压不平衡、谐波畸变等复杂非理想工况下的并网稳定性与同步精度问题;③为ANPC三电平逆变器的先进控制策略开发与性能提升提供详尽的仿真验证方案和技术参考;④支持高水平科研论文的复现、学位论文的课题研究以及重大工程项目前期的技术预研与论证。; 阅读建议:建议读者结合文中详述的系统拓扑、控制架构图及仿真模型,循序渐进地理解各控制模块的设计原理与协同工作机制,重点关注DPWMA调制的实现细节、正负序分离的数学原理与实现方法,以及前馈控制的嵌入方式与参数整定策略,并通过仿真实验与传统控制策略进行对比分析,以深刻掌握该复合控制策略的性能优势与工程应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值