C++ 顺序容器

本文详细介绍了C++中的顺序容器,包括vector、list、deque、forward_list、array和string的特点与性能差异。重点阐述了在不同场景下如何选择合适的容器,以及容器的常用操作,如插入、删除、访问元素等。此外,还提到了forward_list的特殊性和容器适配器stack、queue、priority_queue的使用。
摘要由CSDN通过智能技术生成

一、各个顺序容器性能差异主要体现在一下两个方面:

1.在容器中任意位置添加和删除元素的代价

2.随机访问容器中元素的代价

vector、list、deque、forward_list、array、string

vector是可变大小数组,支持快速随机访问,在尾部插入和删除元素较为方便

list是双向链表,只支持双向顺序访问,在任意位置插入和删除元素都比较方便

deque是双端队列,支持快速随机访问,在头尾位置插入和删除元素较为方便

forward_list是单向链表,只支持单向顺序访问。在任意位置插入和删除元素都比较方便

array是固定大小的数组,支持快速随机访问。不能添加和删除元素

string是专门用于保存char的vector,支持快速随机访问,在尾部插入和删除元素较为方便


对于vector和string由于是在内存中连续存储,所以可以根据下标来计算地址进行访问,在中间删去和添加某一元素,其后面位置都要进行移动以保持连续存储。

list、forward_list主要用于解决在容器任意位置插入和删除元素代价大的问题,但其后果是访问任一元素较为麻烦,需要对整个容器进行遍历后才可以,并且其额外内存开销较大。

deque是一种较为复杂的数据结构,在中间位置添加和删除元素代价较高,但在两端添加和删除元素较为方便,速度与list和forward_list较为接近。

二、关于容器的选用基本原则:

1.除非有很好的理由选用其他容器,否则使用vector

2.容器元素很多,且对空间开销比较敏感,则不要使用list和forward_list

3.如果要求随机访问,则使用vector或string,如果要求在中间位置插入和删除方便,则使用list和forward_list

4.只在头尾位置插入和删除元素,使用deque

5.如果既要求能随机访问容器中元素,又要求可以在任意位置添加和删除元素,那就要看在工程中占主导地位的是随机访问还是任意位置插入、删除(看二者哪个操作需要的更更加频繁),视情况选择vector或者list

三、容器操作层次

几乎可以在容器中保存所有类型的数据

如果出现此种情况,nodefault为无构造函数类型

vector<nodefault> a(10, init);//正确

vector<nodefault> b(10);//错误

1、对所有容器都通用的操作

iterator    迭代器

const_iterator  只读迭代器

size_type     无符号整数类型 //足够存放任何容器对象的大小 例如:string::type

difference_type   带符号整数类型

value_type    元素类型 

reference      元素左值类型   //元素类型的一个引用

const_referemce   元素const左值类型

2、仅仅适用于顺序容器、适用于关联容器、适用于无序容器

3、只适用于一小部分容器

四、容器定义与初始化

1、C c;

C c1(c2);

C c {};

C c (a,b);//ab均为迭代器

C c(n,t);

C c(n);


#include<iostream>
#include<vector>
#include<list>
#include<string>
using namespace std;
int main()
{
list<string> a{ "aaa", "bbb", "ccc" };
list<string>::iterator it = a.begin();
it++;
it++;
list<string> b(a.begin(), it);
for (list<string>::iterator it1 = b.begin(); it1 != b.end(); it1++)
{

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 支持向量机非线性回归通用MATLAB程序解析 #### 一、概述 本文将详细介绍一个基于MATLAB的支持向量机(SVM)非线性回归的通用程序。该程序采用支持向量机方法来实现数据的非线性回归,并通过不同的核函数设置来适应不同类型的数据分布。此外,该程序还提供了数据预处理的方法,使得用户能够更加方便地应用此程序解决实际问题。 #### 二、核心功能与原理 ##### 1. 支持向量机(SVM) 支持向量机是一种监督学习模型,主要用于分类和回归分析。对于非线性回归任务,SVM通过引入核技巧(kernel trick)将原始低维空间中的非线性问题转换为维空间中的线性问题,从而实现有效的非线性建模。 ##### 2. 核函数 核函数的选择直接影响到模型的性能。本程序内置了三种常用的核函数: - **线性核函数**:`K(x, y) = x'y` - **多项式核函数**:`K(x, y) = (x'y + 1)^d` - **径向基函数(RBF)**:`K(x, y) = exp(-γ|x - y|^2)` 其中RBF核函数被广泛应用于非线性问题中,因为它可以处理非常复杂的非线性关系。本程序默认使用的是RBF核函数,参数`D`用于控制斯核函数的宽度。 ##### 3. 数据预处理 虽然程序本身没有直接涉及数据预处理的过程,但在实际应用中,对数据进行适当的预处理是非常重要的。常见的预处理步骤包括归一化、缺失值处理等。 ##### 4. 模型参数 - **Epsilon**: ε-insensitive loss function的ε值,控制回归带宽。 - **C**: 松弛变量的惩罚系数,控制模型复杂度与过拟合的风险之间的平衡。 #### 三、程序实现细节 ##### 1. 函数输入与输出 - **输入**: - `X`: 输入特征矩阵,维度为(n, l),其中n是特征数量,l是样本数量。 - `Y`: 目标值向量,长度为l。 - `Epsilon`: 回归带宽。 - `C`: 松弛变量的惩罚系数。 - `D`: RBF核函数的参数。 - **输出**: - `Alpha1`: 正的拉格朗日乘子向量。 - `Alpha2`: 负的拉格朗日乘子向量。 - `Alpha`: 拉格朗日乘子向量。 - `Flag`: 标记向量,表示每个样本的类型。 - `B`: 偏置项。 ##### 2. 核心代码解析 程序首先计算所有样本间的核矩阵`K`,然后构建二次规划问题并求解得到拉格朗日乘子向量。根据拉格朗日乘子的值确定支持向量,并计算偏置项`B`。 - **核矩阵计算**:采用RBF核函数,通过`exp(-(sum((xi-xj).^2)/D))`计算任意两个样本之间的相似度。 - **二次规划**:构建目标函数和约束条件,使用`quadprog`函数求解最小化问题。 - **支持向量识别**:根据拉格朗日乘子的大小判断每个样本是否为支持向量,并据此计算偏置项`B`。 #### 四、程序扩展与优化 - **多核函数支持**:可以通过增加更多的核函数选项,提程序的灵活性。 - **自动调参**:实现参数自动选择的功能,例如通过交叉验证选择最优的`Epsilon`和`C`值。 - **并行计算**:利用MATLAB的并行计算工具箱加速计算过程,特别是当样本量很大时。 #### 五、应用场景 该程序适用于需要进行非线性回归预测的场景,如经济预测、天气预报等领域。通过调整核函数和参数,可以有效应对各种类型的非线性问题。 ### 总结 本程序提供了一个支持向量机非线性回归的完整实现框架,通过灵活的核函数设置和参数调整,能够有效地处理非线性问题。对于需要进行回归预测的应用场景,这是一个非常实用且强大的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值