首页 > 其他分享 >线性数据结构和 STL

线性数据结构和 STL

时间:2023-07-31 21:15:47浏览次数:27  
标签:end 迭代 STL auto 元素 bound vector 线性 数据结构

vector 容器 (container)

定义及头文件引入

  • 定义:一个可变长数组
  • 头文件:#include <vector>

常用变量定义及函数解析

  • end():尾后迭代器。
  • push_back(x):在末端插入元素 x(自动扩容)。
  • 构造函数
    • 一个参数:建立长度为 n 的数组:vector<int> a(n);
    • 两个参数:建立长度为 n,每个元素的值均为 x 的数组:vector<int> a(n, x);
    • 应用:构造一个 n * m 的二维 vector 嵌套:vector<vector<int>> a(n, vector<int>(m));
    • 注意:局部变量 vector 元素自动初始化为 \(0\),不需要手动清空
  • lower_bound(a.begin(), a.end(), x)vector a 中找到第一个大于等于 x 的数。(序列必须有序!!
    • 注意:如果没有找到,那么返回的是尾后迭代器。不可直接访问。
  • upper_bound(a.begin(), a.end(), x)vector a 中找到第一个大于 x 的数。(序列必须有序!!
    • 注意:如果没有找到,那么返回的是尾后迭代器。不可直接访问。
  • 迭代器类型:随机访问迭代器 random access iterator
    • 特点,可以随意加减,如 *(it - 1) *(it + 4)

遍历

第一种

vector<int> a;
for (int i = 0; i < a.size(); i ++) {
    cout << a[i] << " ";
}
cout << endl;

第二种 (for range) (相当于使用 auto it

vector<int> a;
for (auto i: a) {
    cout << i << " ";
    i = 4; // i 只是值,不会影响 vector
}
cout << endl;

第三种 (完全等价于第二种) (for range)

vector<int> a;
for (auto it = a.begin(); it != a.end(); it ++) {
    auto i = *it;
    cout << i << " ";
}
cout << endl;

使用 auto 进行读入

vector<int> a(n);
for (auto &i: a) { // 中间的 & 很重要!
    cin >> i; // i 为引用,会影响 vector
}

解释

因为第三种完全等价于第二种,所以在第二种中,如果对 i 进行操作,是不会影响到 vector 容器的。换言之,第二种中的 i 代表的是元素的值,而不是引用。

auto &i: a,则会对值进行修改,因为此时 i 变为了引用。

注意:编译器选项中添加 -std=c++14,不能编译则使用 -std=c++11,才可以使用 for range

priority_queue 优先队列(二叉堆)

  • 注意:没有 for range 语法!
  • 大根堆 priority_queue<int> Q
  • 小根堆 priority_queue<int, vector<int>, greater<int>> Q
    • greater<int> 需要 #include <functional>
  • 如需存储结构体则需要运算符重载(必须定义小于号!
    • 大根堆重载小于号
    • 小根堆重载小于号(一般不采用本方法)
    • 小根堆直接把大根堆的运算符重载中所有符号取反(√)

set 容器

  • 维护某个元素是否存在
  • 查询大于等于/大于它的所有数字
  • 维护本质不同的元素有几个

成员函数

set<int> s;

  • s.count(x) 查询 x 是否在 s 中出现。
  • s.erase(x)xs 中删除(如果存在)。
  • lower_boundupper_bound 基本同 vector
  • 迭代器类型:双向访问迭代器 bidirectional access iterator
    • 只可以进行 ++-- 操作
  • set 找到最后一个小于 x 的数:*(--s.lower_bound(4))
  • 找到最大的元素:*--s.end()

multiset 容器

  • 基本同 set
  • 如果使用 erase(x) 则会删除所有值等于 x 的元素
  • 如果想要只删除一个则使用 erase(find(x))

bitset 容器

  • bitset<100> bs 定义一个长度为 100bitset,命名为 bs(长度填在尖括号中,必须为常量)。
  • 定义时可以加入构造函数,填入字符串
#include <bitset>
string s = "100101";
bitset<10> bs(s);

algorithm 库中的常用函数

  • min(a, b) 取最小值
  • max(a, b) 取最大值
  • next_permutation(a, a + n) 数组的下一个排列
  • unique 去重,返回第一个重复元素的地址
  • reverse 翻转

标签:end,迭代,STL,auto,元素,bound,vector,线性,数据结构
From: https://www.cnblogs.com/winter-tide/p/17594482.html

相关文章

  • R语言分布滞后线性和非线性模型(DLM和DLNM)建模|附代码数据
    全文下载链接:http://tecdat.cn/?p=18700最近我们被客户要求撰写关于DLM和DLNM的研究报告,包括一些图形和统计输出。本文说明了R语言中实现分布滞后线性和非线性模型(DLM和DLNM)的建模。首先,本文描述了除时间序列数据之外的DLM/DLNM的一般化方法,在Gasparrini[2014]中有更详细的描......
  • command_block 的《线性基小记》注
    目录1.前置知识2.OI中的线性基张成空间判定问题Ⅰ&Ⅱ实数域线性基k小子集异或和线性基合并带删除线性基总结command_block的《线性基小记》原文1.前置知识线性有关/无关:知乎中有对线性相关与线性无关比较具象化的解释。可以发现,线性基就是一种线性无关构成的线性相关的集合......
  • 基础树形数据结构
    基础树形数据结构0.前言某个MXY问我为什么要讲树形数据结构。原因就是因为它复杂码量大可以装逼,还可以出一点毒瘤题,最重要的是我第一个学的难的知识就是这个能对于修改和查询的优化。下面是四个典型数据结构时间复杂度的比较↓数组前缀和线段树傻子社长树状数组......
  • 【机器学习】多变量线性回归
    LinerRegressionwithMultipleVariable用向量实现的代码,单变量和多变量可以共用多变量线性回归相当于是单变量的扩展,主要还是按照模型假设、构造代价函数和研究代价函数的最小值这样的思路展开。与单变量线性回归不同的是,多变量线性回归还可能涉及到特征缩放的问题,主要原因......
  • Map和Object:JS如何根据需求选择正确的键值对数据结构
    Map和Object都是JavaScript中常用的数据结构,它们都可以用来存储键值对(key-valuepairs)。但是,它们之间也有一些重要的区别,了解这些区别可以帮助我们选择更合适的数据结构来满足我们的需求。公众号:Code程序人生,个人网站:https://creatorblog.cnObject的特点Object是JavaScript中最基本......
  • 【个人模板封装】树套树、高维数据结构
    前言这是我个人使用的一些模板封装,限于个人能力,可能存在诸多不足与漏洞,在未加测试直接使用前请务必小心谨慎。更新可能会滞后于我本地的文档,如有疑问或者催更之类的可以在评论区留言。全文模板测试均基于以下版本信息,请留意版本兼容问题。Windows,64bitG++(ISOC++20)stack......
  • 【机器学习】单变量线性回归
    MLintroduction机器学习:从数据中学习,而不依赖于规则下编程的一种算法Goal:\(min_{w,b}(J(w,b))\)-提供一种衡量一组特定参数与训练数据拟合程度的方法SupervisedLearningrightanswer&&x->ylabelcategoriesRegressionClassificationUnsupervisedLearnin......
  • 考研数据结构——每日一题[表达式求值]
    3302.表达式求值给定一个表达式,其中运算符仅包含+,-,*,/(加减乘整除),可能包含括号,请你求出表达式的最终值。注意:数据保证给定的表达式合法。题目保证符号-只作为减号出现,不会作为负号出现,例如,-1+2,(2+2)*(-(1+1)+2)之类表达式均不会出现。题目保证表达式中所有数字均为......
  • 数据结构基础
    逻辑结构和物理结构记录一下最近开始学习的数据结构与算法逻辑结构是指数据对象中数据元素之间的相互关系。集合结构集合结构中数据元素,除了都属于一个集合外,无其它关系线性结构数据元素之间是一对一的关系树形结构数据元素之间存在一对多的关系圆形结构数据元素存在多对多的关系物......
  • 线性代数
    线性代数在高铁上听了听线性代数的课,概念有点多,怕忘了。行列式一些基础的东西N(A):排列\(A\)的逆序数。2阶行列式:\(A=\begin{vmatrix}a&b\\c&d\end{vmatrix}=ad-bc\)3阶行列式:$A=\begin{vmatrix}a&b&c\\d&e&f\\g&j&i\end{vmatrix}=aei+djc+bf......