2.3 Vector 动态数组(迭代器)
C++数据结构与算法 目录
本文前驱课程
1 C++自学精简教程 目录(必读)
2 Vector<T> 动态数组(模板语法)
本文目标
1 熟悉迭代器设计模式;
2 实现数组的迭代器;
3 基于迭代器的容器遍历;
迭代器语法介绍
对迭代器的详细介绍参考 : 迭代器 iterator 范围for循环 删除容器的元素 remove erase
![](https://img-blog.csdnimg.cn/img_convert/3bf33576a70da6dd8236ebf1ef16d311.png)
迭代器的功能
迭代器实际上是一个内部类。通过下面的迷你代码,我们可以看到迭代器应该具备的能力。
class Vector
{
public:class Iterator{};Iterator begin() {Iterator itr;/* (1)开始迭代器要能指向第一个元素 m_data[0]*/return itr;};Iterator end(){Iterator itr;/* (2)结束迭代器指向空最后一个元素的下一个位置 m_data+m_size */return itr;};int& operator*();// 重载解引用操作符重载:让迭代器可以通过解引用得到其指向变量的引用 *itr = 5;iterator & operator++(); //用于前置形式 ++itr;int* m_data;//存储动态内存int m_size;
};int main()
{Vector arr;auto itr = arr.begin();for (auto itr = arr.begin(); itr != arr.end()/* (3)迭代器要能够比较相等*/; itr++/* (4)迭代器要能够移动到下一个位置 */ ){cout << *itr/* (5)迭代器要能够解引用得到容器的元素*/ << " ";}return 0;
}
迭代器的实现
现在我们考虑如何实现这种能力。
对于动态数组Vector来说:
(1)开始迭代器要能指向第一个元素 m_data[0]:可以给迭代器添加一个构造函数,传递动态数组的首元素地址给迭代器。
(2)结束迭代器指向空最后一个元素的下一个位置:可以给迭代器的构造函数传入动态数组首地址偏移 m_size 个元素后的地址。m_data + m_size
(3)迭代器要能够比较相等:让迭代器重载, 等于操作符 == 不等于操作符 !=
(4)迭代器要能够移动到下一个位置:让迭代器重载自增操作符 ++
(5)迭代器要能够解引用得到容器的元素:让迭代器重载解引用操作符 *
至此,迭代器的功能就全部实现完成了。
完整测试用例
//------下面的代码是用来测试你的代码有没有问题的辅助代码,你无需关注------
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <utility>
using namespace std;
struct Record { Record(void* ptr1, size_t count1, const char* location1, int line1, bool is) :ptr(ptr1), count(count1), line(line1), is_array(is) { int i = 0; while ((location[i] = location1[i]) && i < 100) { ++i; } }void* ptr; size_t count; char location[100] = { 0 }; int line; bool is_array = false; bool not_use_right_delete = false; }; bool operator==(const Record& lhs, const Record& rhs) { return lhs.ptr == rhs.ptr; }std::vector<Record> myAllocStatistic; void* newFunctionImpl(std::size_t sz, char const* file, int line, bool is) { void* ptr = std::malloc(sz); myAllocStatistic.push_back({ ptr,sz, file, line , is }); return ptr; }void* operator new(std::size_t sz, char const* file, int line) { return newFunctionImpl(sz, file, line, false); }void* operator new [](std::size_t sz, char const* file, int line)
{ return newFunctionImpl(sz, file, line, true); }void operator delete(void* ptr) noexcept { Record item{ ptr, 0, "", 0, false }; auto itr = std::find(myAllocStatistic.begin(), myAllocStatistic.end(), item); if (itr != myAllocStatistic.end()) { auto ind = std::distance(myAllocStatistic.begin(), itr); myAllocStatistic[ind].ptr = nullptr; if (itr->is_array) { myAllocStatistic[ind].not_use_right_delete = true; } else { myAllocStatistic[ind].count = 0; }std::free(ptr); } }void operator delete[](void* ptr) noexcept {Record item{ ptr, 0, "", 0, true }; auto itr = std::find(myAllocStatistic.begin(), myAllocStatistic.end(), item); if (itr != myAllocStatistic.end()) { auto ind = std::distance(myAllocStatistic.begin(), itr); myAllocStatistic[ind].ptr = nullptr; if (!itr->is_array) { myAllocStatistic[ind].not_use_right_delete = true; } else { myAllocStatistic[ind].count = 0; }std::free(ptr); }}
#define new new(__FILE__, __LINE__)
struct MyStruct { void ReportMemoryLeak() { std::cout << "Memory leak report: " << std::endl; bool leak = false; for (auto& i : myAllocStatistic) { if (i.count != 0) { leak = true; std::cout << "leak count " << i.count << " Byte" << ", file " << i.location << ", line " << i.line; if (i.not_use_right_delete) { cout << ", not use right delete. "; } cout << std::endl; } }if (!leak) { cout << "No memory leak." << endl; } }~MyStruct() { ReportMemoryLeak(); } }; static MyStruct my; void check_do(bool b, int line = __LINE__) { if (b) { cout << "line:" << line << " Pass" << endl; } else { cout << "line:" << line << " Ohh! not passed!!!!!!!!!!!!!!!!!!!!!!!!!!!" << " " << endl; exit(0); } }
#define check(msg) check_do(msg, __LINE__);
//------上面的代码是用来测试你的代码有没有问题的辅助代码,你无需关注------#include <iostream>
#include <cassert>class Vector
{
public:Vector(void);//1 默认构造函数Vector(int count, int value);//2 非默认构造函数Vector(const Vector& from);//4 复制构造函数Vector(int* start, int* end);// 3 非默认构造函数Vector& operator = (const Vector& from);~Vector();
public:size_t size(void) const;bool empty(void) const;const int& operator[] (size_t n) const;int& operator[] (size_t n);void push_back(const int& val);
public:class iterator{friend class Vector;friend bool operator == (const iterator& lhs, const iterator& rhs);//用于实现!=,因为==非常容易实现friend bool operator != (const iterator& lhs, const iterator& rhs);public:iterator& operator++(); //用于前置形式iterator operator++(int); //用于后置形式,这里有个int参数纯粹是为了区分前自增操作符而加的语法规定int& operator*();//解引用操作符重载private:int* m_hold = nullptr;};class const_iterator{friend class Vector;public:bool operator == (const const_iterator& rhs) { return this->m_hold == rhs.m_hold; }//用于实现!=,因为==非常容易实现bool operator != (const const_iterator& rhs) { return !(*this == rhs); };const_iterator& operator++(); //用于前置形式 ++itr 先改变自己,指向下一个位置,再返回自己const_iterator operator++(int); //用于后置形式 itr++ 先创建一个改变前的副本用于返回,再在返回前改变自己,指向下一个位置const int& operator*() const;private:const int* m_hold = nullptr;};//noexcept 表示这个函数内不会抛出异常,这样有助于编译器优化代码生成const_iterator begin() const noexcept;iterator begin() noexcept;const_iterator end() const noexcept;iterator end() noexcept;
private:void clear(void);
private:size_t m_size;//当前元素数量size_t m_capacity;//容量int* m_data;//数据部分
};
Vector::Vector(void):m_data(nullptr), m_size(0), m_capacity(0)
{std::cout << "Vector()" << std::endl;
}Vector::Vector(const Vector& from)
{if (from.empty()){m_data = nullptr;m_size = 0;m_capacity = 0;return;}m_capacity = m_size = from.m_size;m_data = new int[m_size];for (auto i = 0; i < m_size; ++i){m_data[i] = from.m_data[i];}std::cout << "Vector(const Vector & from)" << std::endl;
}Vector::Vector(int count, int value): m_data(nullptr)
{if (count <= 0){throw std::runtime_error("size of vector to init must bigger than zero!");}m_data = new int[count];for (size_t i = 0; i < count; i++){m_data[i] = value;}m_capacity = m_size = count;std::cout << "Vector(const, value)" << std::endl;
}Vector::Vector(int* start, int* end): m_data(nullptr), m_size(0), m_capacity(0)
{check(start != nullptr && end != nullptr);m_capacity = m_size = ((size_t)end - (size_t)start) / sizeof(int);//这里如果用int来存放可能会盛不下,size_t可以保证盛放的下check(m_size > 0);m_data = new int[m_size];for (size_t i = 0; i < m_size; i++){m_data[i] = *start++;}std::cout << "Vector(start, end)" << std::endl;
}Vector& Vector::operator=(const Vector& from)
{if (this == &from){return *this;}//先释放自己的数据clear();m_size = from.m_size;m_capacity = from.m_capacity;m_data = new int[m_size];for (size_t i = 0; i < m_size; i++){m_data[i] = from.m_data[i];}return *this;std::cout << "Vector & Vector::operator=(const Vector & from)" << std::endl;
}Vector::~Vector()
{if (m_data){delete[] m_data;}std::cout << "~Vector()" << std::endl;
}size_t Vector::size(void) const
{return m_size;
}bool Vector::empty(void) const
{return m_size == 0;
}const int& Vector::operator[](size_t n) const
{return m_data[n];
}int& Vector::operator[](size_t n)
{return m_data[n];
}void Vector::push_back(const int& val)
{if (m_capacity > m_size)//直接追加到最后一个{m_data[m_size++] = val;}else//只有满了的那一瞬间,才翻倍开辟新空间{auto pNewArray = new int[m_capacity = m_capacity + m_capacity];//拷贝老数据for (size_t i = 0; i < m_size; i++){pNewArray[i] = m_data[i];}//追加最新的末尾元素pNewArray[m_size++] = val;delete[] m_data;m_data = pNewArray;}
}
//下面的代码 函数名是 Vector::begin
// 返回值类型是 Vector::const_iterator
//返回值类型之所以要加类作用域是因为,返回值类型在函数作用域之外。这是由C语言继承而来的
Vector::const_iterator Vector::begin() const noexcept
{if (empty()){return end();}const_iterator itr;//(1) your code 下面的代码仅仅是让编译通过,可能需要你重新实现return itr;
}Vector::iterator Vector::begin() noexcept
{if (empty()){return end();}iterator itr;//(1) your code 下面的代码仅仅是让编译通过,可能需要你重新实现return itr;
}Vector::const_iterator Vector::end() const noexcept
{const_iterator itr;//(2) your code 下面的代码仅仅是让编译通过,可能需要你重新实现// 如果容器为空,不能返回下标返回的元素位置return itr;
}Vector::iterator Vector::end() noexcept
{iterator itr;//(2) your code 下面的代码仅仅是让编译通过,可能需要你重新实现// 如果容器为空,不能返回下标返回的元素位置return itr;
}void Vector::clear(void)
{//(3) your code 下面的代码仅仅是让编译通过,可能需要你重新实现}bool operator==(const Vector::iterator& lhs, const Vector::iterator& rhs)
{//(4) your code 下面的代码仅仅是让编译通过,可能需要你重新实现return false;
}bool operator!=(const Vector::iterator& lhs, const Vector::iterator& rhs)
{//(5) your code 下面的代码仅仅是让编译通过,可能需要你重新实现return false;
}Vector::iterator& Vector::iterator::operator++()
{//(6) your code 下面的代码仅仅是让编译通过,可能需要你重新实现return *this;
}
Vector::const_iterator& Vector::const_iterator::operator++()
{//(7) your code 下面的代码仅仅是让编译通过,可能需要你重新实现return *this;
}Vector::iterator Vector::iterator::operator++(int)
{//(8) your code 下面的代码仅仅是让编译通过,可能需要你重新实现return iterator();
}
Vector::const_iterator Vector::const_iterator::operator++(int)
{return Vector::const_iterator();
}
int& Vector::iterator::operator*()
{//(9) your code 下面的代码是错误的!不可以返回临时变量的引用!仅仅是让编译通过,需要你重新实现int a = 0;return a;
}
const int& Vector::const_iterator::operator*() const
{//(9) your code 下面的代码是错误的!不可以返回临时变量的引用!仅仅是让编译通过,需要你重新实现int a = 0;return a;
}
void print(const Vector& v, const std::string& msg)
{std::cout << "print The contents of " << msg.c_str() << " are:";for (int i = 0; i < v.size(); ++i){std::cout << ' ' << v[i];}std::cout << '\n';
}
void print_itr(Vector& v, const std::string& msg)
{std::cout << "print_itr The contents of " << msg.c_str() << " are:";for (auto itr = v.begin(); itr != v.end(); ++itr){std::cout << ' ' << *itr;}std::cout << '\n';
}
void print_const_itr(const Vector& v, const std::string& msg)
{std::cout << "print_const_itr The contents of " << msg.c_str() << " are:";for (auto itr = v.begin(); itr != v.end(); ++itr){//*itr = 4;std::cout << ' ' << *itr;}std::cout << '\n';
}int main()
{Vector a;Vector first; // empty vector of intscheck(first.empty() == true && first.size() == 0);Vector second(4, 100); // four ints with value 100check(second.empty() == false);check(second.size() == 4);check(*second.begin() == 100);Vector fourth(second); // a copy of thirdcheck(fourth.size() == second.size());int myints[] = { 16,2,77,29 };Vector fifth(myints, myints + sizeof(myints) / sizeof(int));check(fifth.empty() == false);check(fifth[0] == 16);check(fifth[3] == 29);check(fifth.size() == sizeof(myints) / sizeof(int));print(fifth, "fifth");//The contents of fifth are:16 2 77 29 fifth.push_back(30);check(fifth[4] == 30);check(fifth.size() == 5);print(fifth, "fifth");//The contents of fifth are:16 2 77 29 30 check(fifth.size() == sizeof(myints) / sizeof(int) + 1);first = fifth = fifth;print(first, "first");//The contents of first are:16 2 77 29 30 check(first.empty() == false && first.size() == fifth.size());print_itr(fifth, "fifth");//The contents of fifth are:16 2 77 29 30 print_const_itr(fifth, "fifth");//The contents of fifth are:16 2 77 29 30 Vector a1(myints, myints + sizeof(myints) / sizeof(int));{Vector b(a1);b.push_back(2);check(b[4] == 2);}{Vector c;for (auto i : c){std::cout << i << " ";}c = a1;a1 = c;c = a1;for (auto i : c){std::cout << i << " ";}std::cout << std::endl;}check(a1.size() == sizeof(myints) / sizeof(int));{Vector c;c = fifth;c[0] = 1;check(c[0] == 1);}
}
期待输出:
Vector()
Vector()
line:335 Pass
Vector(const, value)
line:337 Pass
line:338 Pass
line:339 Pass
Vector(const Vector & from)
line:341 Pass
line:118 Pass
line:120 Pass
Vector(start, end)
line:345 Pass
line:346 Pass
line:347 Pass
line:348 Pass
print The contents of fifth are: 16 2 77 29
line:351 Pass
line:352 Pass
print The contents of fifth are: 16 2 77 29 30
line:354 Pass
print The contents of first are: 16 2 77 29 30
line:357 Pass
print_itr The contents of fifth are: 16 2 77 29 30
print_const_itr The contents of fifth are: 16 2 77 29 30
line:118 Pass
line:120 Pass
Vector(start, end)
Vector(const Vector & from)
line:364 Pass
~Vector()
Vector()
16 2 77 29
~Vector()
line:382 Pass
Vector()
line:387 Pass
~Vector()
~Vector()
~Vector()
~Vector()
~Vector()
~Vector()
~Vector()
Memory leak report:
No memory leak.
祝你好运!
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/3bf33576a70da6dd8236ebf1ef16d311.png)
2.3 Vector 动态数组(迭代器)
C数据结构与算法 目录 本文前驱课程 1 C自学精简教程 目录(必读) 2 Vector<T> 动态数组(模板语法) 本文目标 1 熟悉迭代器设计模式; 2 实现数组的迭代器; 3 基于迭代器的容器遍历; 迭代器语法介绍 对迭…...
![](https://img-blog.csdnimg.cn/f32fb8550fca4498b74bf4f4a648e217.png)
【ES6】Proxy的高级用法,实现一个生成各种 DOM 节点的通用函数dom
下面的例子则是利用get拦截,实现一个生成各种 DOM 节点的通用函数dom。 <body> </body><script>const dom new Proxy({}, {get(target, property) {return function(attrs {}, ...children) {const el document.createElement(property);for …...
![](https://img-blog.csdnimg.cn/img_convert/6c95207c889cb527ea5c3342ace40a87.webp?x-oss-process=image/format,png)
气象站是什么设备?功能是什么?
气象站是一种用于测量和记录气象数据的设备。它通常是由各种传感器及其数据传输设备、固定设备和供电设备组成,可以测量风速、风向、温度、湿度、气压、降水量等气象要素,并将这些数据记录下来,以便进一步分析和研究。 气象站通常设置在广阔…...
![](https://www.ngui.cc/images/no-images.jpg)
227. 基本计算器 II Python
文章目录 一、题目描述示例 1示例 2示例 3 二、代码三、解题思路 一、题目描述 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-2^31, 2^31 - 1]的范围内…...
![](https://www.ngui.cc/images/no-images.jpg)
python中字典常用函数
字典常用函数 cmp(dict1,dict2) (已删除,直接用>,<,即可) 如果两个字典的元素相同返回0,如果字典dict1大于字典dict2返回1,如果字典dict1小于字典dict2返回-1。 先比较字典的长度,然后比较键&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
leetcode88合并两个有序数组
题目: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终&…...
![](https://www.ngui.cc/images/no-images.jpg)
Ceph入门到精通-Nginx 大量请求 延迟优化
优化nginx以处理大量请求并减少延迟可以通过以下几种方法实现: 调整worker_processes和worker_connections参数:增加worker_processes值可以增加nginx的进程数量,提高并发处理能力。增加worker_connections参数的值可以增加每个worker进程可…...
![](https://img-blog.csdnimg.cn/50b3c41f633e4619961a4322075726e6.png#pic_center)
Vulnstack----5、ATTCK红队评估实战靶场五
文章目录 一 环境搭建二 外网渗透三 内网信息收集3.1 本机信息收集3.2 域内信息收集 四 横向移动4.1 路由转发和代理通道4.2 抓取域用户密码4.3 使用Psexec登录域控4.4 3389远程登录 五、痕迹清理 一 环境搭建 1、项目地址 http://vulnstack.qiyuanxuetang.net/vuln/detail/7/ …...
![](https://www.ngui.cc/images/no-images.jpg)
QT 5.8
QT与Qt Creator,前者是框架,类似与MFC,而后者是QT的编译器,也可以使用Visual studio编辑,编译需要其他的 Index of /new_archive/qt/5.8/5.8.0...
![](https://img-blog.csdnimg.cn/8776e378a9ac48b2b8ec2a3d4dfd83d3.png)
AIGC+思维导图:提升你的学习与工作效率的「神器」
目录 一、产品简介 二、功能介绍 2.1 AI一句话生成思维导图 2.2百万模版免费用 2.3分屏视图,一屏读写 2.4团队空间,多人协作 2.5 云端跨平台化 2.6 免费够用,会员功能更强大 2.7 支持多种格式的导入导出 三、使用教程 3.1 使用AI…...
![](https://img-blog.csdnimg.cn/4685d51deba14d4caeee7df2752df800.png)
javaScript:DOM元素的获取(静态/动态获取)
目录 一.dom元素获取的意义与使用场景 使用场景(绝大多数js操作都需要dom操作) 总结/疑问解答! 二.DOM元素获取的常用方法(重点) 获取dom元素(动态) document.gerElementbyId() docume…...
![](https://img-blog.csdnimg.cn/086ed39d5a074267a5250a3df741a1c3.png)
数据结构前言
一、什么是数据结构? 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 上面是百度百科的定义,通俗的来讲数据结构就是数据元素集合与数据元素集合或者数据元素与数据元素之间的组成形式。 举个…...
![](https://www.ngui.cc/images/no-images.jpg)
Docker基于alpine带glibc的小型容器image
由于程序是C写的,gc编译,找了几个容器,生成比较小的是debianslim和ubuntu,生成后的大小分别为88MB,和91MB,还是太大了,于是想起一些小型容器如busybox或者alpine自己装glibc,但是试了…...
![](https://img-blog.csdnimg.cn/be0dae1fea6d460ca26c830078f43e03.png)
Nginx教程
Nginx教程 01-Nginx简介02-windows安装Nginx03-Nginx目录结构04-Linux安装Nginx05-linux下源码安装nginx06-linux下nginx配置07-在docker中安装nginx08-源码安装和yum安装的区别09-Nginx运行组和运行用户10-卸载nginx11-nginx的基本原理和架构12-nginx是如何处理请求的13-nginx…...
![](https://img-blog.csdnimg.cn/03e031daf64043938a08815467229b36.png)
直播预约|哪吒汽车岳文强:OEM和Tier1如何有效对接网络安全需求
信息安全是一个防护市场。如果数字化程度低,数据量不够,对外接口少,攻击成本高,所获利益少,自然就没有什么攻击,车厂因此也不需要在防护上花费太多成本。所以此前尽管说得热闹,但并没有太多真实…...
![](https://www.ngui.cc/images/no-images.jpg)
hiveserver2经常挂断的原因
hiveserver2经常挂断的原因 HiveServer2 经常挂断可能有多种原因,以下是一些可能导致挂断的常见原因: 资源不足:HiveServer2 需要足够的内存和 CPU 资源来处理查询请求。如果资源不足,可能会导致 HiveServer2 挂断。请确保在配置…...
![](https://www.ngui.cc/images/no-images.jpg)
openeuler 23.03 安装mysql 8.X
遇到一堆问题:直接从mysql官下载,都不行。下列是失败的: mysql80-community-release-el8-1.noarch.rpm mysql-8.0.34-1.el8.x86_64.rpm-bundle.tar mysql-8.1.0-1.el9.x86_64.rpm-bundle.tar 后来想从openeuler下载应该靠谱:ht…...
![](https://img-blog.csdnimg.cn/b8c4e7614b144b158019bae05ced60da.jpeg)
网络安全—0基础学习笔记(黑客)
一、前言 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多 google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答. 4.遇到实在搞不懂的,可以先放放,以后再来解决. …...
![](https://www.ngui.cc/images/no-images.jpg)
react HashRouter 与 BrowserRouter 的区别及使用场景
一、简介 在单页面应用中,如何在切换页面后,不刷新浏览器呢?为了解决这个问题,有两种方法,就是hash路由模式、history路由模式,而 react router 的两种路由就是使用这两种路由模式。 二、区别 HashRouter…...
![](https://img-blog.csdnimg.cn/img_convert/446c7c374c566c7f29df473942245af2.png)
痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.3)- 串行NOR Flash下载算法(J-Link工具篇)
https://www.cnblogs.com/henjay724/p/13770137.html 大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是J-Link工具下i.MXRT的串行NOR Flash下载算法设计。 在i.MXRT硬件那些事系列之《在串行NOR Flash XIP调试原理》一文中,痞…...
![](https://img-blog.csdnimg.cn/img_convert/64c4608c2fd0ae04adfc63747e7e252a.png)
多目标应用:基于多目标向日葵优化算法(MOSFO)的微电网多目标优化调度MATLAB
一、微网系统运行优化模型 参考文献: [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、多目标向日葵优化算法 多目标向日葵优化算法(Multi-objective sunflower optimization,MOS…...
![](https://img-blog.csdnimg.cn/img_convert/c0193fc4d424920edf97197a56b3c3dc.png)
智能安全科技,Vatee万腾为您服务
在智能科技的引领下,Vatee万腾将为您点亮投资之路,助您在金融市场中抓住机遇,实现财务目标。作为一家融合科技与投资的先锋平台,Vatee万腾致力于为投资者提供智能化的投资方案和支持。 Vatee万腾以其先进的智能科技为基础…...
![](https://www.ngui.cc/images/no-images.jpg)
Scala中的类型检查和转换,以及泛型,scala泛型的协变和逆变
Scala中的类型检查和转换,以及泛型 类型检查和转换 说明 (1) obj.isInstanceOf[T]:判断 obj 是不是T 类型。 (2) obj.asInstanceOf[T]:将 obj 强转成 T 类型。 (3) cla…...
![](https://img-blog.csdnimg.cn/0a75c643fbb745339c2fcd9c5c22b389.png)
【数据结构】C语言队列(详解)
前言: 💥🎈个人主页:Dream_Chaser~ 🎈💥 ✨✨专栏:http://t.csdn.cn/oXkBa ⛳⛳本篇内容:c语言数据结构--C语言实现队列 目录 一.队列概念及结构 1.1队列的概念 1.2队列的结构 二.队列的实现 2.1头文…...
![](https://img-blog.csdnimg.cn/2a4e8b1e5f2c404fb82fbec46226fc99.png)
【数据结构初阶】一. 复杂度讲解
相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 学C的第三十四天【程序环境和预处理】_高高的胖子的博客-CSDN博客 1 . 算法效率 (1). 什么是数据结构: 数据结构(Data Structure)是计算机存储、…...
![](https://img-blog.csdnimg.cn/c32b6d5097294a54bb75f20b12b6faa4.png)
Jmete+Grafana+Prometheus+Influxdb+Nginx+Docker架构搭建压测体系/监控体系/实时压测数据展示平台+遇到问题总结
背景 需要大批量压测时,单机发出的压力能力有限,需要多台jmeter来同时进行压测;发压机资源不够,被压测系统没到瓶颈之前,发压机难免先发生资源不足的情形;反复压测时候也需要在不同机器中启动压测脚本&…...
![](https://www.ngui.cc/images/no-images.jpg)
php提交表单将html相互字符转化的封装函数
在 PHP 中,您可以使用 htmlspecialchars() 函数将 HTML 字符转换为文本。该函数将把 <、>、" 和 等特殊字符转换为对应的 HTML 实体,从而避免跨站点脚本(XSS)攻击。 例如,如果您有一个表单输入字段的值&a…...
![](https://www.ngui.cc/images/no-images.jpg)
7 Series FPGAs GTX/GTH Transceivers
目录 1. Overview2. Block Diagram3. Transmitter4. Receiver5. Physical Coding Sublayer(PCS)6. Physical Medium Attachment(PMA)本博客为Xilinx 7系列FPGA的千兆比特高速收发器(Gigabit Transceiver, GT)介绍 ug476 - 7 Series FPGAs GTX GTH TransceiversUser Guide…...
![](https://img-blog.csdnimg.cn/e4338fd8034a4932b03df80dd31d9057.png#pic_center)
iOS系统下轻松构建自动化数据收集流程
在当今信息爆炸的时代,我们经常需要从各种渠道获取大量的数据。然而,手动收集这些数据不仅耗费时间和精力,还容易出错。幸运的是,在现代科技发展中有两个强大工具可以帮助我们解决这一问题——Python编程语言和iOS设备上预装的Sho…...
![](https://img-blog.csdnimg.cn/17e594abf8c24c1d827a519557b6d66a.png)
Android基础之Activity生命周期
Activity是Android四大组件之一、称为之首也恰如其分。 Activity直接翻译为中文叫活动。在Android系统中Activity就是我看到的一个完整的界面。 界面中看到的TextView(文字)、Button(按钮)、ImageView(图片)都是需要Activity来承载的。 总…...
![](/images/no-images.jpg)
网站建设课程培训/企业网站运营推广
文章目录 前言I 第三方SDK分享文件1.1 微信SDK1.2 友盟SDK1.3 判断是否安装微信II 原生API的文件预览及其他应用打开2.1 预览文件2.2 文件分享2.3 控制是否显示copy、 print、saveToCameraRollIII 案例3.1 文件下载和预览3.2 使用数据模型保存下载文件路径3.3 使用数据模型分享…...
![](/images/no-images.jpg)
辽宁省人民政府网站官网/营销策划推广公司
在我们用pl/sql的Tools导出用户对象时,例如导出一个表,则导出的t_test.sql的前几行如下: spool test.log prompt prompt Creating table t_test prompt prompt 这里的prompt的作用相当于一般的操作系统命令echo,输出后面的信…...
![](https://img-blog.csdnimg.cn/53a93aab0e704328ae5d57ba7acfd93e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5LiA5Liq5bCP5byA5b-D5ZGA,size_20,color_FFFFFF,t_70,g_se,x_16)
wordpress 评论时间/电商培训机构排名
在项目开发中,遇到了一个需求,就是在Message弹框,在按钮上方添加一行文字 如图: this.$confirm(<span>此操作将永久删除该文件, 是否继续?</span><p style"color:red;">删除后消失</p>, 提示…...
![](https://img-blog.csdnimg.cn/fc312230fc424428a3ed52e705e1a56d.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ2MTYyMzIx,size_16,color_FFFFFF,t_70)
asp.net网站怎么做/网页制作工具
一、Docker架构 Docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。 容器…...
![](https://img-blog.csdnimg.cn/55259dcbc50b48f98912ef20d625ca30.png)
怎样做网站搜索推广电话成都/潍坊百度关键词优化
要共享的目录-右键 然后点击下面共享 复制链接给另一人 另一台电脑输入链接,就可以访问了...
企业微信下载/seo综合查询站长工具怎么用
整数转换英文表示273.整数转换英文表示题目描述思路:模拟273.整数转换英文表示 题目描述 整数转换英文表示 思路:模拟 使用百、十、二十以内组合小于1000的数,大于1000的数以3个3个为一节进行递归处理。 class Solution:def numberToWor…...