当前位置: 首页 > news >正文

《算法笔记》之二(笔记)

1. vector:

1.定义:“变长数组”(长度依据需要而自动改变,节省空间,避免普通数组超内存)

代码定义:vector < typename > name;

注:(注意理解)
vector < vector < int > > name; 为 “二维双变长的数组”;
vector < int > vi[100]; 为 “二维:一维定长(100)、一维变长的数组”;

2.vector容器内元素的访问:

1.通过对“下标”访问:

对 vector < typename > vi 的 vector 容器而言,如:vi[0] - vi[vi.size()-1];

2.通过对“迭代器”访问:*迭代器的定义)

① “迭代器”相关:

定义:举例(其他类型类推):vector < typename >::iterator it;

3.对应函数:

push(赋值)、pop(类似于“栈”):push_back(i) ("i"为待插入的数值)、pop_back();

大小、长度获取:size();

清空:v.clear(); 等价于 erase(v.begin(),v.end());

插入与删除:insert(迭代器, 待插入的值); 、erase(单个迭代器、迭代器范围);
(注:“迭代器” 可理解为:“指针”)

4.用法总结:

5.易错点:

赋值:vi[0]=0;(×) vi.push_back(0);(√)

2. set:

1.定义:“集合”(1.自动有序;2.不含重复元素(结合数学定义记忆))

代码定义:set < typename > name;

2.set容器内元素的访问:(只能通过“迭代器”)

3.对应函数:

插入x(自动排序 & 去重):insert(x),时间复杂度:O(logN)(N为set内元素个数);
寻找:
删除:
“大小及清空” 二操作基本同 “vector”,时间复杂度:O(1),此处不再赘述;

4.用法总结:

3. string:

注意:使用前,引入头文件为 “”,不同于:“< cstring >” 或 “< string.h >”

1.定义:封装:处理字符串的一系列操作,简化编码

代码定义:如:string str;
初始化赋值:如:string str = “code”;(* 注意此处为 “双引号”)

2.string 容器内元素的访问:(1) 基于下标(前三种);(2) 基于 “迭代器”;
// 类似于“字符数组”的输出方式
string str1 = "code";
for (int i=0;i<int(str1.length());i++){printf("%c",str1[i]);
}
printf("\n");    // 为了方便看清楚、美观而换行// 使用"cin/cout":“直接”输入、输出一整行字符串(此处自由输入输出字符串)
string str2;
cin >> str2;
cout << str2 << endl;// 使用"printf"+"c_str()方法",输出一整行字符串(将其转换为“字符数组”)
string str3 = "love";
printf("%s\n",str3.c_str());// 基于 “迭代器” 的方法
string str4 = "work";
// string下,迭代器"it"的定义如下:
string::iterator it;
for (string::iterator it=str4.begin();it!=str4.end();it++){printf("%c",*(it));
}
printf("\n");    // 为了方便看清楚、美观而换行

注:string 同 vector ,支持直接对迭代器进行加减某个数字,如:str.begin()+3

3.对应函数:

(1)operator += ;这是string的加法,可将两个string直接拼接;
(2)compare operator;两个string类型可直接使用 “==;!=;<;<=;>;>=” 比较大小,比较规则是 “字典序”;
(3)获取大小及清空:size()/length(); clear();(同上,时间复杂度为:O(1))
(4)insert :① insert(pos,string); 在pos号位置插入字符串string;② insert(it,it2,it3); it为原字符串的欲插入位置,it2和it3为待插字符的首尾选代器用来表示串[it2,it3)将被插在it的位置上;

// 待拼接的两个子字符串
string str1 = "de";
string str2 = "co";// 用于存储:最终的字符串拼接结果
string str3, str4, str5;// 用"+"拼接
// 注意:被加数在前,加数在后
str3 = str2 + str1;// 用"insert"拼接
str4 = str1.insert(0, str2);// 输出结果:不要忘记"c_str()"
printf("%s\n", str3.c_str());
printf("%s\n", str4.c_str());// 用 “迭代器” 拼接
// 获取待插入字符串的首尾迭代器
string::iterator it1 = str2.begin();
string::iterator it2 = str2.end();
int index = distance(str1.begin(), it1);
str5 = str1.insert(index, it1, it2);printf("%s\n", str5.c_str());

(5) erase :删除单个元素、删除一个区间内所有元素;时间复杂度均为:O(N)

  1. str.erase(it)用于删除单个元素,it为需要删除的元素的迭代器;
  2. str.erase(first,last),其中first为需要删除的区间的起始选代器,而las 则为需要删除的区间的末尾迭代器的下一个地址,也即删除[first,last);
  3. str.erase(pos,length),其中pos为需要开始删除的起始位置,length为删除的字符个数;

(6) substr :获取子串
substr(pos,len) 返回从pos号位开始、长度为len的子串,时间复杂度为:O(len)

6. stack:

1.定义:先进后出

栈顶指针:始终指向栈顶最上方元素的一个标记(数组实现:int;链表实现:int*)
代码定义:stack < typename > name;
(typename可以为:任意基本数据类型或任意stl容器)

2.对应方法:

① 数组实现(《数据结构》部分,了解即可):

// 栈的建立(数组模拟)
st[10001] = {};// 清空(栈顶指针top置为"-1")
void clear () {top = -1;return;
};// 入栈(入栈元素i)
// 栈顶指针上移一位,到达对应地址 → 赋值入栈
void push (int i) {st[++top] = i;return;
};// 出栈(出栈元素i)
// 栈顶指针下移一位,到达对应地址
//(选择是否删除出栈元素)
void push () {top--;return;
};// 计算栈内元素总数(数组下标从"0"开始)
int size () {return top+1;
};// 判空(规定:栈顶指针为"-1"时"栈空")
bool empty () {if (top==-1)return true;elsereturn false;
};// 取栈顶元素(栈顶指针始终指向栈顶元素)
int get_top () {return st[top];
};

② STL容器实现:stl内容器 “stack” 的 各方法时间复杂度均为:O(1)
出栈:st.pop();
入栈("x"为入栈元素):st.push(x);
统计大小:st.size();
判空:st.empty();(返回bool值:true or false)
取栈顶元素:st.top();

清空:

// 如果栈不为空,则不断地pop栈顶元素,直至为空(效果等同于“清空栈”)
while (!st.empty()) {
st.pop();
};

3.用法总结:

stack 用于:模拟实现一些递归,防止“程序对栈内存的限制”,而导致程序出错。

9. algorithm 头文件下的常用函数:

1.max( )、min( )、abs( ):

image

2.swap(x, y) —— 交换两数的值

3.reverse(it1, it2)
将数组指针在[it1,it2)间的元素、或容器的迭代器在[it,it2)范围内的元素进行 “反转”;
举例:字符串反转:
image

4.全排列时使用:next_permutation()

举例一:
image

举例二:
题目:http://codeup.hustoj.com/problem.php?cid=100000604&pid=1
image

题解:
image

http://www.lqws.cn/news/480043.html

相关文章:

  • 基于split-Bregman算法的L1正则化matlab仿真,对比GRSR算法
  • RA4M2开发IOT(8)----IIC驱动OLED
  • 分库分表下的 ID 冲突问题与雪花算法讲解
  • Qt项目,记事本
  • YOLOv8/11自定义seg分割数据集格式转换json2txt
  • 第八章 目录一致性协议 A Primer on Memory Consistency and Cache Coherence - 2nd Edition
  • 如何用AI开发完整的小程序<10>—总结
  • unity版本控制PlasticSCM转git
  • 需求初步探讨-从OR-AR
  • 《Redis》事务
  • 抽象工厂设计模式
  • 查询消耗 IO 多的 SQL -达梦
  • 一个免费的视频、音频、文本、图片多媒体处理工具
  • 数据库高性能应用分析报告
  • 鸿蒙 Column 组件指南:垂直布局核心技术与场景化实践
  • Python爬虫实战:研究Ghost.py相关技术
  • 【深度学习与机器学习的区别】从本质到应用的全景对比
  • 单例模式-Python示例
  • 多设备Obsidian笔记同步:WebDAV与内网穿透技术高效实现教程
  • 探秘Flink Connector加载机制:连接外部世界的幕后引擎
  • 考研408《计算机组成原理》复习笔记,第三章(1)——存储系统概念
  • 【数据结构试题】
  • 【JS-4.4-键盘常用事件】深入理解DOM键盘事件:提升用户交互体验的关键
  • idea——AI时代学习python的必要性
  • 学习打卡---回溯
  • linux jq命令详解
  • 基于深度学习的智能图像风格迁移系统:技术与实践
  • Spring AI 项目实战(十一):Spring Boot +AI + DeepSeek 开发智能教育作业批改系统(附完整源码)
  • 华为云Flexus+DeepSeek征文|华为云 Dify 高可用部署教程:CCE 容器集群一键构建企业级智能应用
  • 【第一章-计算机系统概述】