C++面向对象(OOP)编程-STL详解(vector)
本文主要介绍STL六大组件,并主要介绍一些容器的使用。
目录
1 泛型编程
2 C++STL
3 STL 六大组件
4 容器
4.1 顺序性容器
4.1.1 顺序性容器的使用场景
4.2 关联式容器
4.2.1 关联式容器的使用场景
4.3 容器适配器
4.3.1 容器适配器的使用场景
5 具体容器的使用和剖析
5.1 vector(向量)
5.1.2 vector扩容
1 泛型编程
泛型编程是一种代码重用技术,尽可能的将代码写的抽象和通用,将算法从数据结构抽象出来,以便适配多种多样的数据结构,C++的模板编程就是一种泛型编程技术。
2 C++STL
STL(Standard Template Library),即标准模板库,是一个高效的C++程序库。
被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。
包含了诸多在计算机科学领域里常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。
从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming)
在这种思想里,大部分基本算法被抽象,被泛化,独立于与之对应的数据结构,用于以相同或相近的方式处理各种不同情形。
从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的,基于模板(template)。
简单理解:
STL 的基本观念就是将数据和操作分离。数据由容器进行管理,操作则由算法进行,而迭代器在两者之间充当粘合剂,使任何算法都可以和任何容器交互运作。
3 STL 六大组件
STL的组成 | 含义 |
---|---|
容器 | 一些封装数据结构的模板类,例如 vector 向量容器、list 列表容器等。 |
算法 | STL 提供了非常多(大约 100 个)的数据结构算法,它们都被设计成一个个的模板函数,这些算法在 std 命名空间中定义,其中大部分算法都包含在头文件 <algorithm> 中,少部分位于头文件 <numeric> 中。 |
迭代器 | 在 C++ STL 中,对容器中数据的读和写,是通过迭代器完成的,扮演着容器和算法之间的胶合剂。 |
函数对象 | 如果一个类将 () 运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象(又称仿函数)。 |
适配器 | 可以使一个类的接口(模板的参数)适配成用户指定的形式,从而让原本不能在一起工作的两个类工作在一起。值得一提的是,容器、迭代器和函数都有适配器。 |
内存分配器 | 为容器类模板提供自定义的内存申请和释放功能,由于往往只有高级用户才有改变内存分配策略的需求,因此内存分配器对于一般用户来说,并不常用。简称分配器。 |
4 容器
所谓容器,就是可以承载,包含元素的一个器件,它是STL六大组件之一,是容器、算法、迭代器中最重要也是最核心的一部分。
4.1 顺序性容器
顺序性容器就是将一组具有相同类型的元素以严格的线性形式组织起来。顺序性容器的存储结构有顺序存储和链式存储。
具体的顺序性容器如下:
容器 | 简介说明 |
---|---|
vector | 可变大小数组。相当于数组,可动态构建,支持随机访问,无头插和尾插,仅支持inset插入,除尾部外的元素删除比较麻烦。但使用最为广泛。 |
deque | 双端队列。支持头插、删,尾插、删,随机访问较vector容器来说慢,但对于首尾的数据操作比较方便 |
list | 双向循环链表。使用起来很高效,对于任意位置的插入和删除都很快,在操作过后,以后指针、迭代器、引用都不会失效 |
forward_list | 单向链表。只支持单向访问,在链表的任何位置进行插入/删除操作都非常快 |
array | 固定数组。vector的底层即为array数组,它保存了一个以严格顺序排列的特定数量的元素 |
4.1.1 顺序性容器的使用场景
一般大多数的题目都可以使用vector容器,除非有特定需求使用其他容器更加合理方便;
如果需要在一串数字的头尾进行操作,偏向deque,对于较中间的元素操作,不推荐;
对于中间的元素插入或删除,可采用forward_list(单向链表)或list(双向链表),不需要移动元素,只需改变相关结点的指针域即可;
一个例子:
#include <iostream>
#include <vector>using namespace std;// vector容器大小:
// 1 2 4 8 16 32
// vector 容器大小的增长是以2的倍数
int main(int argc, char *argv[])
{vector<int> v1;for (int i = 0;i < 17;i++)v1.push_back(i);cout << v1[3] << endl;cout << v1.size() << endl;cout << v1.capacity() << endl;return 0;
}
运行结果:
4.2 关联式容器
关联式容器每一个元素都有一个键值(key),对于二元关联容器,还拥有实值(value)容器中的元素顺序不能由程序员来决定,有set(集合)和map(映射)这两大类,它们均是以RB-Tree(red-black tree,红黑树)为底层架构。
具体的关联式容器如下:
容器 | 简介说明 |
---|---|
set/mutliset | 集合/多重集合。对于set,在使用insert插入元素时,已插入过的元素不可重复插入,这正好符合了集合的互异性,在插入完成显示后,会默认按照升序进行排序,对于multiset,可插入多个重复的元素 |
map/mutlimap | 映射/多重映射。二者均为二元关联容器(在构造时需要写两个参数类型,前者对key值,后者对应value值),因为有两个参数,因此在插入元素的时候需要配合对组pair进行插入,具体见深入详解 |
4.2.1 关联式容器的使用场景
如果只负责查找内容,具体到某个单位,使用场景比如对手机游戏的个人的计分的存储,可以使用set或mutliset。
如果需要同时放入容器的数据不止一个,并且是不同类型,比如一个为整型int,一个为string字符串型,就可以考虑使用map或mutlimap。
4.3 容器适配器
容器适配器是一个封装了序列容器的一个类模板=,它在一般的序列容器的基础上提供了一些不同的功能。之所以称为容器适配器,是因为它是适配容器来提供其它不一样的功能。通过对应的容器和成员函数来实现我们需要的功能。
具体的容器适配器如下:
容器 | 简介说明 |
---|---|
stack | 堆栈。其原理是先进后出(FILO),其底层容器可以是任何标准的容器适配器,默认为deque双端队列 |
queue | 队列。其原理是先进先出(FIFO),只有队头和队尾可以被访问,故不可有遍历行为,默认也为deque双端队列 |
pirority_queue | 优先队列。它的第一个元素总是它所包含的元素中优先级最高的,就像数据结构里的堆,会默认形成大堆,还可以使用仿函数来控制生成大根堆还是生成小根堆,若没定义,默认使用vector容器 |
4.3.1 容器适配器的使用场景
(1)对于 stack 堆栈,在我们日常生活中类似于坐地铁、电梯;
(2)对于 deque 队列,在我们日常生活中类似于排队打饭;
(3)对于 pirority_queue,因为其本质是堆,可以考虑解决一些贪心问题;
5 具体容器的使用和剖析
5.1 vector(向量)
对于vector容器,它的数据结构与数组非常类似,但是他们之间的不同之处是数组是静态空间,一旦配置了就不能更改,vector却可以进行动态分配,随着元素的插入和删除,内部的空间也会灵活变动,就和C语言中的malloc和C++中的new是一个道理,不用害怕空间不足而一开始就定义一个很大的数组,节省了内存空间。容器的大小是可以改变的。vector扩容是2的倍数。
一些例子:
#include <iostream>
#include <vector>/** 线性表是一种逻辑结构,按照存储结构可以分为顺序表和链表**
*/
/* vector 本质上是一个动态变长数组,顺序表,连续的存储空间,访问的时间复杂度为O(1),对于尾部元素的插入和删除时间复杂度都是常量级别的* vector 也是一个类模板,vector底层本质就是一个顺序表,它是一个可变长的数组,采用连续存储的空间来存储数据,它的元素类型也可以是任意的内置类型或者自定义类型。* 对于vector的扩容机制,Linux一般是以2的倍数增加,VS一般是以1.5的倍数增加,增加快的性能会比较好,但是对空间的浪费会增大;* vector扩容是开辟一段新的空间,将旧的数据拷贝到新的空间
*/
/** 扩容 vec.resize(n) vec.reserve(n)
*/int main(int argc, char *argv[])
{std::vector<int> vec = {1, 2, 3, 4, 5};// vec.begin()+2 代表从第三个元素开始,vec。begin()代表从第一个元素开始std::vector<int> vec1(vec.begin()+2,vec.end()); // = vecstd::vector<int> vec2(vec); // = vecstd::vector<int> vec3(4); // [0,0,0,0]std::vector<int> vec4(2,4); // [4,4]// vec.erase(vec.begin()+1); // 删除第二个元素vec.erase(vec.begin(),vec.begin()+1);//删除[1,3) 删除两个元素for (auto i : vec1) {std::cout << i << " ";std::cout << "*******" << std::endl;}vec.push_back(18); //在尾部插入一个元素std::cout << "Front1: " << vec.front() << std::endl;std::cout << "Back1: " << vec.back() << std::endl;vec.pop_back(); // 弹出尾部的元素vec.insert(vec.begin()+4,3,99);for (int i = 0;i < vec.size();i++){// std::cout << "vec(" << i << "): " << vec[i] << std::endl;std::cout << "vec(" << i << "): " << vec.at(i) << std::endl;}for (int i = 0;i < vec.size();i++){std::cout << i << " : " << vec.data()[i] << std::endl;}std::cout << "*********" << std::endl;std::vector<int>::iterator it;for (it = vec.begin();it != vec.end();it++){std::cout << " " << " : " << *it << std::endl;}std::cout << "*********" << std::endl;for (auto it = vec.begin();it != vec.end();it++){std::cout << " " << " : " << *it << std::endl;}std::cout << "*********" << std::endl;// 返回常量迭代器的元素for (auto it = vec.cbegin();it != vec.cend();it++){std::cout << " " << " : " << *it << std::endl;}std::cout << "*********" << std::endl;// 逆序返回常量迭代器的元素for (auto it = vec.rbegin();it != vec.rend();it++){std::cout << " " << " : " << *it << std::endl;}std::cout << "*********" << std::endl;std::cout << "size: " << vec.size() << " Capacity: " << vec.capacity() << std::endl;vec.clear();/* vec.resize(n) resize的扩容不会改变容器中原来的值,这里默认对扩容的部分初始化为0* n > capacity 时 ,可以对vector进行扩容,此时 size = capacity = n,n 为任意的大于原来capacity的值* n < capacity 时,不能对vector进行扩容,此时 size = n,但是 capacity 仍然与原来的capacity 相等* vec.reserve(n) 是指将容器的容量改为n,容器中的数据的个数不做改变也就是,不会对vec.size() 做改变* n > capacity 时 ,可以仅仅对容器进行扩容,此时size保持不变,capacity = n* n < capacity 时 ,不做任何的改变,对size 和capacity没有任何影响* vec.assign(n,0) assign的扩容会改变容器中原来的值,第二个参数就是需要改变后的值* n > capacity 时 ,可以对vector进行扩容,此时 size = capacity = n,n 为任意的大于原来capacity的值* n < capacity 时,不能对vector进行扩容,此时 size = n,但是 capacity 仍然与原来的capacity 相等* 总之,对于vector容器只能增大其容量,不能减小其容量*/vec.push_back(12);vec.push_back(13);// vec.resize(13);vec.assign(13,0);// vec.reserve(13); // 仅仅改变capacity 的大小std::cout << "Resize size: " << vec.size() << " Capacity: " << vec.capacity() << std::endl;std::cout << "size: " << vec.size() << " vec = [ ";for (int i = 0;i < vec.size();i++){std::cout << vec[i] << " ";}std::cout << " ] " << std::endl; // vec.assign(13,0) 的输出结果: size: 13 vec = [ 0 0 0 0 0 0 0 0 0 0 0 0 0 ] vec.resize(13) 的输出结果: size: 13 vec = [ 12 13 0 0 0 0 0 0 0 0 0 0 0 ] for (int i = 0;i < 10;i++){vec.push_back(i);} // 需要对vector进行扩容,一般扩容是2的指数级别的std::cout << "After clear size: " << vec.size() << " Capacity: " << vec.capacity() << std::endl;if (vec.empty()){std::cout << "Vec is empty!" << std::endl;}std::vector<int> vecT[3];// vector 定义二维数组for (int i = 0;i < 3;i++){vecT[i].push_back(i);std::cout << "vecT" << i << " size: " << vecT[i].size() << std::endl;}std::vector<std::vector<int>> vecT1;// vector 定义二维数组vecT1.resize(5);//5 行for (int i = 0;i < 5;i++){vecT1[i].resize(10);//10 列}for (int i = 0;i < vecT1.size();i++){for (int j = 0;j < vecT1[i].size();j++){vecT1[i][j] = i*j;}}for (int i = 0;i < vecT1.size();i++){for (int j = 0;j < vecT1[i].size();j++){std::cout << vecT1[i][j] << " ";}}std::cout << std::endl;return 0;
}
5.1.2 vector扩容
(1)vec.resize(n)
vec.resize(n) resize的扩容不会改变容器中原来的值,这里默认对扩容的部分初始化为0
n > capacity 时 ,可以对vector进行扩容,此时 size = capacity = n,n 为任意的大于原来capacity的值
n < capacity 时,不能对vector进行扩容,此时 size = n,但是 capacity 仍然与原来的capacity 相等
(2)vec.reserve(n)
vec.reserve(n) 是指将容器的容量改为n,容器中的数据的个数不做改变也就是,不会对vec.size() 做改变
n > capacity 时 ,可以仅仅对容器进行扩容,此时size保持不变,capacity = n
n < capacity 时 ,不做任何的改变,对size 和capacity没有任何影响
(3)vec.assign(n,0)
vec.assign(n,0) assign的扩容会改变容器中原来的值,第二个参数就是需要改变后的值
n > capacity 时 ,可以对vector进行扩容,此时 size = capacity = n,n 为任意的大于原来capacity的值
n < capacity 时,不能对vector进行扩容,此时 size = n,但是 capacity 仍然与原来的capacity 相等
总之,对于vector容器只能增大其容量,不能减小其容量
相关文章:
C++面向对象(OOP)编程-STL详解(vector)
本文主要介绍STL六大组件,并主要介绍一些容器的使用。 目录 1 泛型编程 2 CSTL 3 STL 六大组件 4 容器 4.1 顺序性容器 4.1.1 顺序性容器的使用场景 4.2 关联式容器 4.2.1 关联式容器的使用场景 4.3 容器适配器 4.3.1 容器适配器的使用场景 5 具体容器的…...
postman几种常见的请求方式
1、get请求直接拼URL形式 对于http接口,有get和post两种请求方式,当接口说明中未明确post中入参必须是json串时,均可用url方式请求 参数既可以写到URL中,也可写到参数列表中,都一样,请求时候都是拼URL 2&am…...
openai最新探索:超级对齐是否可行?
前言 今天来介绍一篇openai最新的paper:弱到强的对齐。 openai专门成立了一个团队来做大模型的超级对齐即superhuman model,之前chatgpt取得成功依赖RLHF即依赖人类反馈,但是作者期望的superhuman model将会是一个能够处理各种复杂问题的强…...
本地websocket服务端结合cpolar内网穿透实现公网访问
文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…...
关于“Python”的核心知识点整理大全37
目录 13.6.2 响应外星人和飞船碰撞 game_stats.py settings.py alien_invasion.py game_functions.py ship.py 注意 13.6.3 有外星人到达屏幕底端 game_functions.py 13.6.4 游戏结束 game_stats.py game_functions.py 13.7 确定应运行游戏的哪些部分 alien_inva…...
Vivado中的FFT IP核使用(含代码)
本文介绍了Vidado中FFT IP核的使用,具体内容为:调用IP核>>配置界面介绍>>IP核端口介绍>>MATLAB生成测试数据>>测试verilogHDL>>TestBench仿真>>结果验证>>FFT运算。 1、调用IP核 该IP核对应手册pg109_xfft.pd…...
创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
2022年亚马逊云科技re:Invent盛会于近日在拉斯维加斯成功召开,吸引了众多业界精英和创新者。亚马逊云科技边缘服务副总裁Jan Hofmeyr在演讲中分享了关于亚马逊云科技海外服务器边缘计算的最新发展和创新成果,引发与会者热烈关注。 re:Invent的核心主题是…...
什么是“人机协同”机器学习?
“人机协同”(HITL)是人工智能的一个分支,它同时利用人类智能和机器智能来创建机器学习模型。在传统的“人机协同”方法中,人们会参与一个良性循环,在其中训练、调整和测试特定算法。通常,它的工作方式如下…...
数学建模笔记-拟合算法
内容:拟合算法 一.概念: 拟合的结果就是找到一个确定的曲线 二.最小二乘法: 1. 2.最小二乘法的二表示的是平方的那个2 3.求解最小二乘法: 三.评价拟合的好坏 1.总体评分和SST: 2.误差平方和SSE: 3.回…...
非线性约束的优化问题_序列二次规划算法代码
1. 理论部分 2. 序列二次规划算法代码及解析 3.完整代码 1.理论部分 a.约束优化问题的极值条件 库恩塔克条件(Kuhn-Tucker conditions,KT条件)是确定某点为极值点的必要条件。如果所讨论的规划是凸规划,那么库恩-塔克条件也是充分条件。 ÿ…...
【数据结构之顺序表】
数据结构学习笔记---002 数据结构之顺序表1、介绍线性表1.1、什么是线性表? 2、什么是顺序表?2.1、概念及结构2.2、顺序表的分类 3、顺序表接口的实现3.1、顺序表动态存储结构的Seqlist.h3.1.1、定义顺序表的动态存储结构3.1.2、声明顺序表各个接口的函数 3.2、顺序表动态存储…...
junit-mock-dubbo
dubbo单元测试分两种情况 Autowired注解是启动上下文环境,使用上下文对象进行测试,适合调试代码 InjectMocks注解是启动上下文环境,使用mock对象替换上下文对象,适合单元测试 BaseTest *** Created by Luohh on 2023/2/10*/ S…...
json解析之fastjson和jackson使用对比
前言 最近项目中需要做埋点分析,首先就需要对埋点日志进行解析处理,刚好这时候体验对比了下fastjson和jackson两者使用的区别,以下分别是针对同一个json串处理,最终的效果都是将json数据解析出来,并统一展示。 一、fa…...
设计模式之-模板方法模式,通俗易懂快速理解,以及模板方法模式的使用场景
系列文章目录 设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列 设计模式之-单列设计模式,5种单例设计模式使用场景以及它们的优缺点 设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式,每一种模式的概念、使用…...
微软官方出品:GPT大模型编排工具,支持C#、Python等多个语言版本
随着ChatGPT的火热,基于大模型开发应用已经成为新的风口。虽然目前的大型模型已经具备相当高的智能水平,但它们仍然无法完全实现业务流程的自动化,从而达到用户的目标。 微软官方开源的Semantic Kernel的AI编排工具,就可以很好的…...
docker安装的php 在cli中使用
1: 修改 ~/.bashrc 中新增 php7 () {ttytty -s && tty--ttydocker run \$tty \--interactive \--rm \--volume /website:/website:rw \--workdir /website/project \--networkdnmp_dnmp \dnmp_php php "$" }–networkdnmp_dnmp 重要, 不然连不上数据库, 可通…...
tcp vegas 为什么好
我吹捧 bbr 时曾论证过它在和 buffer 拧巴的时候表现如何优秀,但这一次说 vegas 时,我说的是从拥塞控制这个问题本身看来,vegas 为什么好,并且正确。 接着昨天 tcp vegas 鉴赏 继续扯。 假设一群共享带宽的流量中有流量退出或有…...
【设计模式】命令模式
其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、什么是命令模式? 二、命令模式的优点和应用场景 三、命令模式的要素和实现 3.1 命令 3.2 具体命令 3.3 接受者 …...
Unity头发飘动效果
Unity头发飘动 介绍动作做头发飘动头发骨骼绑定模拟物理组件 UnityChan插件下载UnityChan具体用法确定人物是否绑定好骨骼节点(要做的部位比如头发等)给人物添加SpringManager骨骼管理器给骨骼节点添加SpringBone这里给每个头发骨骼都添加上SpringBone。…...
【MIKE】MIKE河网编辑器操作说明
目录 MIKE河网编辑器说明河网定义河网编辑工具栏河网文件(.nwk11)输入步骤1. 从传统的地图引入底图1.1 底图准备1.2 引入河网底图1.3 输入各河段信息2. 从ARCView .shp文件引入底图MIKE河网编辑器说明 河网编辑器主要功能有两个: ①河网的编辑和参数输人,包括数字化河网及…...
RIPV1配置实验
查看路由器路由表: 删除手工配置的静态路由项: Route1->Config->static Remove删除路由项 删除Route3的路由项,方法同上删除Route2的路由项,方法同上 完成路由器RIP配置: Route1->Config->RIP->Ne…...
快速实现农业机械设备远程监控
农业机械设备远程监控解决方案 一、项目背景 近年来,农业生产事故时有发生,农业安全问题已经成为农业生产中的关键问题,农业监控系统在农业安全生产中发挥着重要作用。农业机械设备以计划维修或定期保养为主,在日常应用的过程中因…...
解决用Fiddler抓包,网页显示你的连接不是专用/私密连接
关键:重置fiddler的证书 在Fiddler重置证书 1、Actions --> Reset All Certificates --> 弹窗一路yes 2、关掉Fiddler,重新打开 3、手机删掉证书,重新下载安装。 (如果还不行,重新试一遍,先把浏览器…...
单片机原理及应用:流水灯的点亮
流水灯是一种简单的单片机控制电路,由许多LED组成,电路工作时LED会按顺序点亮,类似于流水的效果。 下面是运行在keil上的代码,分别使用了数组,移位符和库函数来表示。 //数组法 #include <reg52.h> //头文…...
蓝桥杯宝藏排序算法(冒泡、选择、插入)
冒泡排序: def bubble_sort(li): # 函数方式for i in range(len(li)-1):exchangeFalsefor j in range(len(li)-i-1):if li[j]>li[j1]:li[j],li[j1]li[j1],li[j]exchangeTrueif not exchange:return 选择排序: 从左往右找到最小的元素,放在起始位置…...
使用@jiaminghi/data-view实现一个数据大屏
<template><div class"content bg"><!-- 全局容器 --><!-- <dv-full-screen-container> --><!-- 第二行 --><div class"module-box" style"align-items: start; margin-top: 10px"><!-- 左 -->…...
神经网络:池化层知识点
1.CNN中池化的作用 池化层的作用是对感受野内的特征进行选择,提取区域内最具代表性的特征,能够有效地减少输出特征数量,进而减少模型参数量。按操作类型通常分为最大池化(Max Pooling)、平均池化(Average Pooling)和求和池化(Sum Pooling)&a…...
微服务常见的配置中心简介
微服务架构中,常见的配置中心包括以下几种: Spring Cloud Config: Spring Cloud Config是官方推荐的配置中心解决方案,它支持将配置文件存储在Git、SVN等版本控制系统中。通过提供RESTful API,各个微服务可以远程获取和…...
银河麒麟v10 rpm安装包 安装mysql 8.35
银河麒麟v10 rpm安装包 安装mysql 8.35 1、卸载mariadb2、下载Mysql安装包3、安装Mysql 8.353.1、安装Mysql 8.353.3、安装后配置 1、卸载mariadb 由于银河麒麟v10系统默认安装了mariadb 会与Mysql相冲突,因此首先需要卸载系统自带的mariadb 查看系统上默认安装的M…...
一篇文章带你搞定CTFMice基本操作
CTF比赛是在最短时间内拿到最多的flag,mice必须要有人做,或者一支战队必须留出一块时间专门写一些mice,web,pwn最后的一两道基本都会有难度,这时候就看mice的解题速度了! 说实话,这是很大一块&…...
做网站需要硬件软件/应用下载app排行榜
一、账号登录 1.1 用户名登录 1. 用户名登录逻辑分析 2. 用户名登录接口设计 1.请求方式 选项方案请求方法POST请求地址/login/2.请求参数:表单 参数名类型是否必传说明usernamestring是用户名passwordstring是密码rememberedstring是是否记住用户3.响应结果&…...
有名的网站开发工具/网站优化公司哪个好
QML Modules 在Qt 6.2中,首次出现了一个全面的构建系统API,允许您将QML模块指定为一个完整的、封装的单元。这是一个显著的改进,但由于QML模块的概念在Qt 5中还很不成熟,甚至经验丰富的QML开发人员现在可能会问“QML模块到底是什…...
如何做网站霸屏/用广州seo推广获精准访问量
相信大家都在地址栏里用javascript:的形式执行过脚本。这种方法简单实用,测试比较短的脚本时经常用到。并且可以添加到收藏夹里,随时点击调用。 不过脚本比较长的时候,需要复制密密麻麻一大段到地址栏里,显得很不美观,…...
广州做淘宝的化妆品网站/seo优化怎么做
Tkinter.Tk是Tkinter库中用于创建窗口的类。它包含以下常用函数: init(self, masterNone, **kw):构造函数,用于创建Tk对象。 title(self, stringNone):设置或返回窗口的标题。 geometry(self, newGeometryNone):设置或…...
做网站的如何找客户/seo网站管理
转载:http://blog.sina.com.cn/s/blog_8a7012cf01017h9p.html C_C变量命名规则 变量命名规则是为了增强代码的可读性和容易维护性。以下为C必须遵守的变量命名规则: 1、 变量名只能是字母(A-Z,a-z)和数字࿰…...