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

C++ vector容器的介绍与使用

一、vector简介

std::vector 是 C++ 标准模板库 (STL) 中的一个动态数组容器。允许存储元素(可以使用任何数据类型作为其元素类型)集合,并能够动态调整其大小。

特点:

  1. 动态大小:与常规数组不同,vector 可以在运行时改变大小。

  2. 连续存储:vector 保证其元素在内存中是连续存储的,可以使用指针或迭代器遍历其元素。

  3. 访问:可以使用索引运算符 [] 快速访问 vector 中的元素,与常规数组类似,此外还有 at() 方法提供带边界检查的访问。

  4. 性能:向 vector 的末尾添加/删除元素(使用 push_back 或 pop_back)通常是快速的。但在 vector 的中间或开始位置插入/删除元素需要移动多个元素,相对较慢。

  5. 内存:随着元素的添加,在当前分配的内存不足以容纳更多的元素时,vector 会重新分配内存(这可能导致之前的迭代器、指针和引用失效)

  6. 函数:vector 提供了一系列函数来管理其元素。

本文主要参考:https://cplusplus.com/reference/vector/vector/

关于代码的相关解释也可以在该网站中查询。

本文主要以示例代码为演示,结合函数说明来对vector的相关用法进行阐述。

二、初始化

1. 代码示例

#include <iostream>
#include <vector>
using namespace std;int main() {vector<string> v1;v1.push_back("hello");v1.push_back("world");for(int i=0; i<v1.size(); i++)cout<<v1[i]<<" "; cout<<endl;// 输出为:hello world vector<int> v2(5,99);for(int i=0; i<v2.size(); i++)cout<<v2[i]<<" "; cout<<endl;// 输出为:99 99 99 99 99vector<int> v3({0, 1, 2});vector<int> v4 = {3, 4, 5};for(int i=0; i<v3.size(); i++)cout<<v3[i]<<" "; cout<<endl;// 输出为:0 1 2for(int i=0; i<v4.size(); i++)cout<<v4[i]<<" "; cout<<endl;// 输出为:3 4 5int arr[] = {1, 2, 3, 4, 5, 6};vector<int> v5(arr,arr+5);for(int i=0; i<v5.size(); i++)cout<<v5[i]<<" "; cout<<endl;// 输出为:1 2 3 4 5vector<int> v6(v5.begin(),v5.end()-2);for(int i=0; i<v6.size(); i++)cout<<v6[i]<<" "; cout<<endl;// 输出为:1 2 3vector<int> v7(v5);for(int i=0; i<v7.size(); i++)cout<<v7[i]<<" "; cout<<endl;// 输出为:1 2 3 4 5vector<int> v8;v8 = v7;for(int i=0; i<v8.size(); i++)cout<<v8[i]<<" "; cout<<endl;// 输出为:1 2 3 4 5cout << &v5 << endl << &v7 << endl << &v8 << endl;// 输出三个地址,可以发现地址并不相同// 说明v5、v7、v8虽然内容相同,但却是两个不同的对象,位于内存中的不同位置。return 0;
}

注:

v.begin()指向 vector 中 第一个元素 的迭代器
v.end()  指向 vector 中 最后一个元素之后的位置 的迭代器(并不指向 vector 中的任何元素)

2.函数说明

vector();
// 默认构造函数:创建一个空的 vector。
// 如上述代码 vector<string> v1;vector(size_type n); 
// 创建一个包含 n 个元素的 vectorvector(size_type n, const value_type& value);
// 创建一个包含 n 个元素,每个元素的值 value 的 vector。
// vector<int> v2(5,99);vector(initializer_list<value_type> il);
// 使用初始化列表il 来初始化 vector
// vector<int> v3({0, 1, 2});vector(InputIterator first, InputIterator last);
// 使用初始化列表创建
// vector<int> v5(arr,arr+5);
// vector<int> v6(v5.begin(),v5.end()-2);vector(vector& x);
// 复制 vector
// vector<int> v7(v5);
// 上面这句代码的效果等价于 vector<int> v7 = v5;

2. 容量

1. 代码示例

#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> v1(2,7);for(auto t : v1)cout<< t <<" "; cout << endl;// 输出为:7 7cout<< "size:" << v1.size() << endl;cout << "capacity:" << v1.capacity() << endl;// 输出为:size:2// 输出为:capacity:2v1.push_back(8);cout<< "size:" << v1.size() << endl;cout << "capacity:" << v1.capacity() << endl;// 输出为:size:3// 输出为:capacity:4cout<< "max_size:" << v1.max_size() << endl;// 输出视情况而定,本机此处输出为:max_size:2305843009213693951v1.resize(1);for(auto t : v1)cout<< t <<" "; cout << endl;// 输出为:7cout<< "size:" << v1.size() << endl;cout << "capacity:" << v1.capacity() << endl;// 输出为:size:1// 输出为:capacity:4v1.resize(5,99);for(auto t : v1)cout<< t <<" "; cout << endl;// 输出为:7 99 99 99 99cout<< "size:" << v1.size() << endl;cout << "capacity:" << v1.capacity() << endl;// 输出为:size:5// 输出为:capacity:5v1.reserve(9);for(auto t : v1)cout<< t <<" "; cout << endl;// 输出为:7 99 99 99 99cout<< "size:" << v1.size() << endl;cout << "capacity:" << v1.capacity() << endl;// 输出为:size:5// 输出为:capacity:9v1.shrink_to_fit();for(auto t : v1)cout<< t <<" "; cout << endl;// 输出为:7 99 99 99 99cout<< "size:" << v1.size() << endl;cout << "capacity:" << v1.capacity() << endl;// 输出为:size:5// 输出为:capacity:5cout<< v1.empty() << endl;// 输出为:0cout<< "size:" << v1.size() << endl;cout << "capacity:" << v1.capacity() << endl;// 输出为:size:5// 输出为:capacity:5v1.resize(0);cout<< v1.empty() << endl;// 输出为:1cout<< "size:" << v1.size() << endl;cout << "capacity:" << v1.capacity() << endl;// 输出为:size:0// 输出为:capacity:5return 0;
}

2.函数说明

size_type size(); 
// vector中包含元素的数量。
// size_type is an unsigned integral type。size_type capacity();
// 返回vector已分配存储空间的大小,该值大于等于 size()。当此容量耗尽并且需要更多容量时,容器会自动扩展它(重新分配其存储空间)。size_type max_size();
// vector可以容纳的最大元素数量,由系统或库的限制决定,是非常大的值。void resize(n);
void resize(n, value);
// 改变vector的大小,使其包含 n 个元素。当 n 大于当前大小时,添加 n - size() 个新元素,值为 value ;如果 n 小于当前大小,则将删除最后的 size() - n 个元素。resize 可能会导致 vector 的内存重新分配(但不一定,我测试了一下,没有看到capacity()的变化)。bool empty();
// 判断vector的size()是否为0void reserve(n);
// 请求更改capacity,如果 n 大于当前矢量容量,则该函数会导致容器重新分配其存储,将其容量增加到 n(或更大)。如果 n 小于或等于当前容量,则该函数不会产生任何效果。使用 reserve 可以提高效率,特别是知道最终需要存储多少元素时。void shrink_to_fit();
// 请求容器减小其capacity以适应其size。

3. 元素访问

1. 代码示例

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;int main() {vector<int> v1;v1.push_back(100);v1.push_back(99);cout<< v1[0] << endl;// 输出为:100    cout<< v1.at(1) << endl;// 输出为:99v1.resize(6,1);for(auto t : v1) cout << t <<" "; cout << endl;// 输出为:100 99 1 1 1 1cout << v1.front() << " " << v1.back() << endl;// 输出为:100 1v1.front() = 88;v1.back() = 123;cout << v1.front() << " " << v1.back() << endl;// 输出为:88 123vector<int>::iterator it;for (it = v1.begin(); it != v1.end(); it++)cout << *it <<" "; cout << endl;// 输出为:88 99 1 1 1 123int* p = v1.data();for(int i=0; i<v1.size(); i++, p++) cout << *p <<" ";  cout << endl;// 输出为:88 99 1 1 1 123int* q = v1.data();memset(q, 0, v1.size() * sizeof(int));for(auto t : v1) cout << t <<" "; cout << endl;// 输出为:0 0 0 0 0 0return 0;
}

2.函数说明

//——————以vector<int> v为例——————[] 运算符
// 访问下标为n的元素可以使用v[n]访问reference at(n);
// 访问下标为n的元素
// 返回值类型 reference 是容器元素的引用类型,此处的reference类型为intreference front();
// 返回对vector中第一个元素的引用reference back();
// 返回对vector中最后一个元素的引用value_type* data();
// 该函数返回一个指向容器中第一个元素的指针。这是一种直接访问底层数组的方法。
// 此处的返回值类型 value_type* 为 int* 类型。// for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
// 使用迭代器输出每个元素

4. 修改

1. 代码示例

#include <iostream>
#include <vector>
using namespace std;class P {
private:string name;int age;
public:P(string str, int n){name = str;age = n;}void print(){cout << name << " " << age << endl;}
};int main() {vector<int> v1;v1.resize(5,99);for(auto t : v1) cout << t <<" "; cout << endl;// 输出为:99 99 99 99 99v1.pop_back();v1.pop_back();for(auto t : v1) cout << t <<" "; cout << endl;// 输出为:99 99 99 v1.assign({1,2,3,4,5});for(auto t : v1) cout << t <<" "; cout << endl;// 输出为:1 2 3 4 5vector<int> v2(v1.begin(), v1.begin() + 3);for(auto t : v2) cout << t <<" "; cout << endl;// 输出为:1 2 3v1.swap(v2);for(auto t : v1) cout << t <<" "; cout << endl;// 输出为:1 2 3for(auto t : v2) cout << t <<" "; cout << endl;// 输出为:1 2 3 4 5//------------以下使用class P ------------vector<P> v;v.emplace_back("ubuntu", 66);v.push_back(P("windows", 99));for(auto temp : v) temp.print();// 输出为:// ubuntu 66// windows 99v.emplace(v.begin()+1, "computer", 100);for(auto temp : v) temp.print();// 输出为:// ubuntu 66// computer 100// windows 99v.insert(v.begin()+2, {P("aaa", 1),P("bbb", 2)});v.insert(v.begin()+4, P("ccc", 3));for(auto temp : v) temp.print();// 输出为:// ubuntu 66// computer 100// aaa 1// bbb 2// ccc 3// windows 99v.insert(v.begin(), v.begin()+2,v.begin() + 5);for(auto temp : v) temp.print();// 输出为:// aaa 1// bbb 2// ccc 3// ubuntu 66// computer 100// aaa 1// bbb 2// ccc 3// windows 99v.erase(v.begin(), v.begin() + 4);for(auto temp : v) temp.print();// 输出为:// computer 100// aaa 1// bbb 2// ccc 3// windows 99vector<P>::iterator it;it = v.begin();v.erase(it + 3);for(auto temp : v) temp.print();// 输出为:// computer 100// aaa 1// bbb 2// windows 99v.clear();cout << "size:" << v.size() << " capacity:" << v.capacity() << endl;// 输出为:size:0 capacity:12return 0;
}

2.函数说明

void push_back(value_type&& val);
// 在 vector 的末尾添加一个新元素,(当新的 vector 大小超过当前 vector 的 capacity 时,会自动重新分配存储空间)
// 与其功能类似的还有emplace_back()函数
// 比如向vector末尾插入一个整数100:
//     v.push_back(100);void emplace_back(Args&&... args);
// 在 vector 末尾插入一个新元素,类似于push_back()
// Args&&... args 为 基本数据类型参数,或者类的构造函数参数
// emplace_back 是直接在 vector 的末尾就地构造一个元素,而不是先创建一个元素然后复制或移动它到 vector 中。
// push_back 是用于添加已经创建的对象或临时对象到 vector 的末尾。
// emplace_back 的效率会更高一些。void pop_back();
// 删除 vector 的最后一个元素,将 size 减小 1。
// pop_back()用于删除最后一个元素,注意与back()区别,back()用来访问最后一个元素。void clear();
// 删除所有元素,使size为0;void swap (vector& x);
// 交换两个 vector 对象的内容.
// 这是一个非常高效的操作,不涉及实际数据的复制,只是交换内部指针、大小和容量。
// std::vector<int> vec1 = {1, 2, 3};
// std::vector<int> vec2 = {4, 5, 6, 7};
// vec1.swap(vec2); //vec1: {4, 5, 6, 7},  vec2: {1, 2, 3}iterator erase (const_iterator position);
// 从vector中删除某个元素
iterator erase (const_iterator first, const_iterator last);
// 从vector中删除[first,last)元素
// 函数返回值为一个指向被函数调用擦除的 最后一个元素之后的元素的新位置 
// vector<int> vec = {1, 2, 3, 4, 5};
// vec.erase(vec.begin() + 2);  // 删除第三个元素,vec现在是{1, 2, 4, 5}
// vector<int> vec1 = {1, 2, 3, 4, 5};
// vec1.erase(vec1.begin() + 1, vec1.begin() + 4);  // 删除第二个到第四个元素,vec现在是{1, 5}void assign(size_type n, const value_type& val);
// assign会清除容器的当前内容,并将其替换为指定的新内容。
// 清除vector,并使用 n 个值为 value 的元素 替换。
// 比如使用 10 个 0 填充,v.assign(10, 0);void assign (InputIterator first, InputIterator last);
// 从另一个容器或数组的给定范围中的元素替换 vector 的内容。
// vector<int> source = {1, 2, 3, 4, 5};
// vector<int> dest1,dest2;
// dest1.assign(source.begin(), source.begin() + 3);  // dest1: {1, 2, 3}
// dest2.assign(source.begin(), source.end() - 3);  // dest2: {1, 2}void assign (initializer_list<value_type> il);
// std::vector<int> vec;
// vec.assign({7, 8, 9, 10});  // vec: {7, 8, 9, 10}iterator insert(const_iterator position, const T& value);
iterator insert(const_iterator position, size_type n, const T& value);
// 当 n 缺省时:在指定位置插入一个元素,返回值为指向插入元素的迭代器类型 iterator
// vector<int> vec = {1, 2, 4};
// vec.insert(vec.begin() + 2, 3);  // vec: {1, 2, 3, 4}
// 当 插入元素数量 n 指定时:在指定位置插入 n 个元素,返回值为指向插入的第一个元素的迭代器类型 iterator
// vector<int> vec = {1, 2, 4};
// vec.insert(vec.begin() + 1, 2, 999);  // vec: {1, 999, 999, 2, 4}
// 插入操作需要从插入位置开始,向后移动所有元素,所以其时间复杂度为O(n)。iterator insert(const_iterator position, InputIterator first, InputIterator last);
// 从范围插入元素:从另一个容器或数组的指定范围插入元素。
// vector<int> vec = {1, 2, 4};
// int arr[] = {101, 102, 103};
// vec.insert(vec.begin() + 1, arr, arr + 3);  // vec1: {1, 101, 102, 103, 2, 4}iterator insert(const_iterator position, std::initializer_list<T> il);
// 从初始化列表插入元素。
// vector<int> vec = {1, 2, 4};
// vec.insert(vec.begin() + 1, {101, 102, 103});  // vec: {1, 101, 102, 103, 2, 4}iterator emplace (const_iterator position, Args&&... args);
// position 指定了插入元素的位置
// Args&&... args 为 基本数据类型参数,或者类的构造函数参数
// emplace() 和 insert()类似,都是在指定位置插入元素,但emplace()效率会更高一些
// vector<int> vec = {1, 2, 4};
// vec.emplace(vec.begin() + 2, 3);  // 在第三个位置插入3,vec: {1, 2, 3, 4}// vector<vector<int>> matrix;
// matrix.emplace(matrix.begin(), vector<int> {1, 2, 3});  // 在matrix的开始处插入一个vector

如有不当或错误之处,恳请您的指正,谢谢!!!

相关文章:

C++ vector容器的介绍与使用

一、vector简介 std::vector 是 C 标准模板库 (STL) 中的一个动态数组容器。允许存储元素&#xff08;可以使用任何数据类型作为其元素类型&#xff09;集合&#xff0c;并能够动态调整其大小。 特点&#xff1a; 动态大小&#xff1a;与常规数组不同&#xff0c;vector 可以…...

openstack的组成

OpenStack 是一个开源的云计算平台&#xff0c;由一系列组件构成&#xff0c;各组件之间相互协作&#xff0c;提供了完整的基础设施即服务&#xff08;IaaS&#xff09;解决方案。下面详细解释了 OpenStack 的主要组件及其相互关系&#xff1a; Nova&#xff08;计算服务&…...

[React] React高阶组件(HOC)

文章目录 1.Hoc介绍2.几种包装强化组件的方式2.1 mixin模式2.2 extends继承模式2.3 HOC模式2.4 自定义hooks模式 3.高阶组件产生初衷4.高阶组件使用和编写结构4.1 装饰器模式和函数包裹模式4.2 嵌套HOC 5.两种不同的高阶组件5.1 正向的属性代理5.2 反向的继承 6.如何编写高阶组…...

【逐步剖C++】-第二章-C++类和对象(中)

前言&#xff1a;本章继【逐步剖C】-第二章-C类和对象&#xff08;上&#xff09;介绍有关类和对象更深层次的知识点&#xff0c;这里是文章导图&#xff1a; 本文较长&#xff0c;内容较多&#xff0c;大家可以根据需求跳转到自己感兴趣的部分&#xff0c;希望能对读者有一些帮…...

PL/SQL动态SQL

目录 1. 动态 sql 2. 带参数的动态 sql -- 不使用 USING 传参 1. 动态 sql -- 在 PL/SQL 程序开发中,可以使用 DML 语句,但是很多语句(如 DDL),不能直接在 PL/SQL中执行,这些语句可以使用动态 sql 来实现. 语法格式: EXECUTE IMMEDIATE --动态语句的字符串 [into 变量…...

Python绘图系统24:添加辅助坐标轴

文章目录 辅助坐标增减坐标轴时间轴**代码优化源代码 Python绘图系统&#xff1a; 前置源码&#xff1a; Python打造动态绘图系统&#x1f4c8;一 三维绘图系统 &#x1f4c8;二 多图绘制系统&#x1f4c8;三 坐 标 轴 定 制&#x1f4c8;四 定制绘图风格 &#x1f4c8;五 数据…...

Java自学网站--十几个网站的分析与评测

原文网址&#xff1a;Java自学网站--十几个网站的分析与评测_IT利刃出鞘的博客-CSDN博客 简介 很多想学Java的人不知道怎样选教程&#xff0c;本文对Java自学网站进行评测。 本文不带主观倾向&#xff0c;只客观分析各个网站的区别。 第1类&#xff1a;大型培训机构(黑马等…...

java接口怎么写

Java接口是一种定义规范的抽象类型&#xff0c;可以包含常量和方法的声明。接口在Java编程中具有重要的作用&#xff0c;可以实现代码的重用和灵活性。本文将详细介绍Java接口的编写方式和使用方法。 一、什么是Java接口 在Java中&#xff0c;接口&#xff08;Interface&…...

第8章 Spring(二)

8.11 Spring 中哪些情况下,不能解决循环依赖问题 难度:★★ 重点:★★ 白话解析 有一下几种情况,循环依赖是不能解决的: 1、原型模式下的循环依赖没办法解决; 假设Girl中依赖了Boy,Boy中依赖了Girl;在实例化Girl的时候要注入Boy,此时没有Boy,因为是原型模式,每次都…...

从0开始python学习-24.selenium 浏览器常见的操作

1. 浏览器的最大化/最小化&#xff1a;maximize_window () / minimize_window() 2. 设置浏览器的宽高&#xff1a;set_window_size() 3. 设置浏览器的位置&#xff1a;set_window_position(0,0) —》左上角为原点 4. 刷新&#xff1a;refresh() 5. 前进&#xff1a;forward() 6…...

Canal实现数据同步

1、Canal实现数据同步 canal可以用来监控数据库数据的变化&#xff0c;从而获得新增数据&#xff0c;或者修改的数据。 1.1 Canal工作原理 原理相对比较简单&#xff1a; 1、canal模拟mysql slave的交互协议&#xff0c;伪装自己为mysql slave&#xff0c;向mysql master发送…...

数据库学习笔记——DDL

数据库学习笔记——DDL 建立EMPLOYEE数据库&#xff1a; CREATE TABLE employee(employee_ID int not null,employee_name varchar(20) not null,street varchar(20) not null,city varchar(20) not null,PRIMARY KEY(employee_ID) );CREATE TABLE company(company_name varc…...

MATLAB算法实战应用案例精讲-【人工智能】边缘计算(附python代码实现)

目录 前言 几个高频面试题目 边缘计算和云计算的关系 云计算(cloud computing) 边缘计算...

精彩回顾 | 迪捷软件亮相2023世界智能网联汽车大会

2023年9月24日&#xff0c;2023世界智能网联汽车大会&#xff08;以下简称大会&#xff09;在北京市圆满落幕。迪捷软件北京参展之行圆满收官。 本次大会由工业和信息化部、公安部、交通运输部、中国科学技术协会、北京市人民政府联合主办&#xff0c;是我国首个经国务院批准的…...

【ShaderLab PBR 嗜血边缘角色_美式朋克风格_“Niohoggr“_角色渲染(第一篇)】

嗜血边缘角色Cyberpunk style Unity 渲染 《嗜血边缘》截取其中的片段如下:资源分析其中Guitar贴图4张模型:人物细节图:人物模型 Inspector面板这里做一个区域区分:Body贴图1_BC贴图1_BC属性:Body贴图2_NBody贴图3_CMBody贴图4_SRMBody贴图4_RGBReflection Probe第一版Sha…...

python经典百题之围圈报数

题目:有n个人围成一圈&#xff0c;顺序排号。从第一个人开始报数&#xff08;从1到3报数&#xff09;&#xff0c;凡报到3的人退出圈子&#xff0c;问最后留下的是原来第几号的那位。 程序分析 思路1&#xff1a;模拟游戏过程 使用一个循环队列模拟游戏过程&#xff0c;每次循…...

Google Earth Engine(GEE)案例——如何去除和过滤Landsat和sentinel等系列影像集合中的空影像(三种方法)

简介 本文的主要解决的问题是如何去除和过滤Landsat和sentinel等系列影像集合中的空影像?这个主要源于一下的问题: “从图像集中删除空图像”是什么意思?您的脚本将图像集合过滤到没有图像的日期,这会产生包含 0 个图像的图像集合:https: https://code.earthengine.goog…...

Leetcode 69.x的平方根

给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&#xff1…...

Node18.x基础使用总结(二)

Node18.x基础使用总结 1、Node.js模块化1.1、模块暴露数据1.2、引入模块 2、包管理工具2.1、npm2.2、npm的安装2.3、npm基本使用2.4、搜索包2.5、下载安装包2.6、生产环境与开发环境2.7、生产依赖与开发依赖2.8、全局安装2.9、修改windows执行策略2.10、安装包依赖2.11、安装指…...

LCD 的RGB接口(SYNC Mode/ SYNC-DE Mode/ DE Mode)

1、 SYNC Mode Timing Diagram 2、 SYNC-DE Mode Timing Diagram 3、 DE Mode Timing Diagram RGB接口&#xff08;SYNC Mode/ SYNC-DE Mode/ DE Mode&#xff09;-CSDN博客...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...