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

C++ std::vector

std::vector 是 C++ STL 中最常用的序列容器之一,它提供了动态数组的功能,结合了数组的高效访问和链表的动态扩展能力。

1、底层结构与核心原理

1.1 内存布局

  • 连续内存空间vector 底层是一块连续的动态分配内存,这使得它支持 随机访问(通过下标 []at() 方法,时间复杂度 O(1))。

  • 三个核心指针

    • start:指向内存块的起始位置(第一个元素)。
    • finish:指向最后一个元素的下一个位置。
    • end_of_storage:指向内存块的结束位置。

    三者关系:[start, finish) 是已使用空间,[finish, end_of_storage) 是未使用的预留空间。

1.2 容量(capacity)与大小(size)

  • size:当前存储的元素数量(finish - start)。
  • capacity:总分配的内存可容纳的元素数量(end_of_storage - start)。
  • size == capacity 时,继续插入元素会触发 扩容

1.3 扩容机制

  • 触发条件:插入元素后 size 超过当前 capacity
  • 扩容步骤
    1. 分配一块更大的内存(通常是原容量的 1.5 倍或 2 倍,不同编译器实现不同,如 GCC 是 2 倍,VS 是 1.5 倍)。
    2. 将旧内存中的元素复制/移动到新内存。
    3. 释放旧内存。
    4. 更新 startfinishend_of_storage 指针。
  • 注意:扩容后,原有的迭代器、指针、引用都会失效(因为指向的旧内存已释放)。

1.4 迭代器类型

  • 随机访问迭代器 (RandomAccessIterator): 支持所有指针算术运算,如 iter + n, iter - n, iter[n], iter1 < iter2 等。功能最强大的迭代器。

1.5 主要优点

  • 高效的随机访问: 通过 [].at() 访问任何元素的时间复杂度是 O(1)
  • 高效的尾部操作: 在尾部进行 push_backpop_back平摊时间复杂度是 O(1)
  • 缓存友好性: 由于内存连续,遍历时具有良好的空间局部性,CPU 缓存命中率高,遍历速度极快。

1.6 主要缺点

  • 低效的中间/头部插入删除: 在 vector 头部或中间插入/删除元素,需要移动后续的所有元素,时间复杂度是 O(n)
  • 潜在的迭代器失效: 任何可能引起内存重新分配的操作(如 push_back 导致扩容)都会使所有指向该 vector 的迭代器、引用和指针失效。

2、常用操作与示例代码

2.1 包含头文件与创建 vector

#include <iostream>
#include <vector>int main() {// 1. 创建空 vectorstd::vector<int> vec1;// 2. 创建并初始化 (C++11)std::vector<int> vec2 = {1, 2, 3, 4, 5};// 3. 创建包含 n 个相同元素的 vectorstd::vector<int> vec3(5, 100); // {100, 100, 100, 100, 100}// 4. 通过迭代器范围创建int arr[] = {6, 7, 8};std::vector<int> vec4(arr, arr + 3); // {6, 7, 8}// 5. 拷贝构造std::vector<int> vec5(vec2); // vec5 是 vec2 的副本return 0;
}

2.2 添加元素

std::vector<int> vec;// 在尾部添加元素 (最常用!)
vec.push_back(1); // vec: {1}
vec.push_back(2); // vec: {1, 2}
vec.push_back(3); // vec: {1, 2, 3}// C++11: 在尾部就地构造元素,避免拷贝/移动,更高效
vec.emplace_back(4); // vec: {1, 2, 3, 4}// 在指定位置前插入元素 (谨慎使用!成本高)
auto it = vec.begin() + 2; // 指向第3个元素 (3)
vec.insert(it, 999);       // 在 3 之前插入 999 -> {1, 2, 999, 3, 4}// C++11: 在指定位置就地构造元素
vec.emplace(it, 888);      // -> {1, 2, 888, 999, 3, 4}// 插入多个元素或一个区间
vec.insert(vec.end(), 3, 100); // 在末尾插入3个100

2.3 访问元素

std::vector<int> vec = {10, 20, 30};// 1. 使用下标运算符 [] (最快,但不做边界检查)
std::cout << vec[0] << std::endl; // 输出 10
// vec[5] = 1; // 错误!未定义行为,可能导致程序崩溃// 2. 使用 .at() 成员函数 (做边界检查,更安全)
std::cout << vec.at(1) << std::endl; // 输出 20
// vec.at(5) = 1; // 抛出 std::out_of_range 异常,可以被捕获处理// 3. 访问首尾元素
std::cout << "First: " << vec.front() << std::endl; // 等同于 vec[0]
std::cout << "Last: " << vec.back() << std::endl;   // 等同于 vec[vec.size()-1]// 4. 获取底层数据的原始指针 (用于兼容C API)
int* data_ptr = vec.data();
std::cout << *(data_ptr + 2) << std::endl; // 输出 30

2.4 删除元素

std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8};// 删除尾部元素 (高效!)
vec.pop_back(); // vec: {1,2,3,4,5,6,7}// 删除指定位置的元素 (成本可能高)
auto it = vec.begin() + 3; // 指向第4个元素 (4)
it = vec.erase(it);        // 删除 4,it 现在指向 5 -> {1,2,3,5,6,7}// 删除一个区间 [first, last)
vec.erase(vec.begin() + 1, vec.begin() + 3); // 删除 [2,3) -> {1,5,6,7}// 清空整个 vector
vec.clear(); // size() 变为 0,但 capacity() 通常不变// 删除所有值为 5 的元素 (Erase-remove idiom)
vec = {1, 5, 2, 5, 3};
vec.erase(std::remove(vec.begin(), vec.end(), 5), vec.end()); // -> {1,2,3}

2.5 大小与容量管理

  • size(): 当前拥有的元素数量。
  • capacity(): 当前已分配的内存最多能容纳的元素数量 (size() <= capacity())。
  • reserve(n): 预分配至少能容纳 n 个元素的内存。这是优化性能的关键,可以避免多次不必要的扩容。
  • resize(n): 改变 size()n。如果 n > size(),则添加新元素(默认初始化);如果 n < size(),则丢弃多余元素。capacity() 可能不变也可能改变
std::vector<int> vec;std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl; // 0, 0vec.push_back(1);
std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl; // 1, 1vec.push_back(2); // 需要扩容 -> capacity becomes 2 (假设增长因子为2)
vec.push_back(3); // 需要扩容 -> capacity becomes 4
std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl; // 3, 4// 提前预留空间,避免多次扩容
std::vector<int> optimized_vec;
optimized_vec.reserve(1000); // 一次性分配足够空间
for (int i = 0; i < 1000; ++i) {optimized_vec.push_back(i); // 这1000次push_back都不会触发扩容!
}// 调整大小
vec.resize(2);  // vec: {1, 2}, size=2, capacity=4 (未变)
vec.resize(5);  // vec: {1, 2, 0, 0, 0}, size=5, capacity=?
vec.resize(6, 99); // vec: {1, 2, 0, 0, 0, 99}, size=6// 释放未使用的内存 (C++11),通常用于节省空间
// "shrink_to_fit" 请求将 capacity() 减少至 size(),但实现不一定保证
vec.shrink_to_fit();
std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl; // 6, 6 (可能)

2.6 循环

2.6.1 使用范围-based for 循环 (C++11+)
#include <iostream>
#include <vector>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 只读访问for (int num : numbers) {std::cout << num << " ";}// 输出: 1 2 3 4 5// 修改元素for (int& num : numbers) {num *= 2; // 每个元素乘以2}// 再次输出for (int num : numbers) {std::cout << num << " ";}// 输出: 2 4 6 8 10return 0;
}
2.6.2 使用传统 for 循环
#include <iostream>
#include <vector>int main() {std::vector<std::string> fruits = {"Apple", "Banana", "Cherry"};for (size_t i = 0; i < fruits.size(); ++i) {std::cout << i << ": " << fruits[i] << "\n";}// 输出:// 0: Apple// 1: Banana// 2: Cherryreturn 0;
}
2.6.3 使用迭代器

常规迭代器

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> primes = {2, 3, 5, 7, 11};// 使用迭代器遍历for (auto it = primes.begin(); it != primes.end(); ++it) {std::cout << *it << " ";}// 输出: 2 3 5 7 11// 反向迭代器std::cout << "\nReverse: ";for (auto rit = primes.rbegin(); rit != primes.rend(); ++rit) {std::cout << *rit << " ";}// 输出: 11 7 5 3 2return 0;
}

常量迭代器

#include <iostream>
#include <vector>void printVector(const std::vector<int>& vec) {for (auto it = vec.cbegin(); it != vec.cend(); ++it) {std::cout << *it << " ";}
}int main() {std::vector<int> data = {10, 20, 30, 40};printVector(data);return 0;
}

2.7 使用 STL 算法

2.7.1 std::for_each
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> values = {1, 2, 3, 4, 5};// 使用lambda表达式std::for_each(values.begin(), values.end(), [](int n) {std::cout << n * n << " ";});// 输出: 1 4 9 16 25// 带索引的版本 (C++14+)int index = 0;std::for_each(values.begin(), values.end(), [&index](int n) {std::cout << "Value[" << index++ << "] = " << n << "\n";});return 0;
}
2.7.2 std::transform(修改元素)
#include <iostream>
#include <vector>
#include <algorithm>
#include <cctype>int main() {std::vector<std::string> words = {"hello", "world", "c++", "vector"};// 将每个字符串转为大写std::transform(words.begin(), words.end(), words.begin(),[](std::string s) {for (char& c : s) c = std::toupper(c);return s;});// 输出结果for (const auto& word : words) {std::cout << word << " ";}return 0;
}
2.7.3 使用 std::copy_if和 std::for_each
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 只处理偶数std::for_each(numbers.begin(), numbers.end(), [](int n) {if (n % 2 == 0) {std::cout << n << " is even\n";}});// 收集所有奇数std::vector<int> odds;std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(odds),[](int n) { return n % 2 != 0; });std::cout << "Odd numbers: ";for (int n : odds) {std::cout << n << " ";}// 输出: Odd numbers: 1 3 5 7 9 return 0;
}

3、性能优化技巧

  1. 使用 reserve(): 如果能预知元素的大致数量,务必使用 reserve() 提前分配足够内存,这是提升 vector 性能最有效的手段。
  2. 优先使用 emplace_back(): 对于非平凡类型,emplace_back 直接在校位构造对象,避免了临时对象的创建和拷贝/移动操作,比 push_back 更高效。
  3. 理解迭代器失效规则: 在循环中插入/删除元素时,要特别小心迭代器失效的问题。erase() 会返回下一个有效的迭代器,应利用这一点。

4、常见问题

  1. vector的底层原理是什么?它是如何动态增长的?**
    vector的底层是一个在堆上分配的动态数组。它维护三个核心指针:startend(指向最后一个元素的下一个位置)和 end_of_storage(指向分配内存的末尾)。当使用push_backinsert等操作导致当前容量(capacity)不足时(即 size() == capacity()),它会执行一次重新分配(Reallocation):
    1. 分配一块新的、更大的内存块(通常是当前容量的 1.52 倍,这取决于编译器实现,如GCC常用2倍,VS常用1.5倍)。
    2. 将原有所有元素移动拷贝到新内存中(C++11后,如果元素类型有移动构造函数,则会使用移动,更高效)。
    3. 释放旧的内存块。
    4. 更新内部的指针指向新内存。
    这个过程性能开销较大,因此如果事先知道元素数量,使用reserve()预分配空间可以避免多次重分配,显著提升性能。

  2. push_backemplace_back 的区别?
    两者都是在尾部添加一个新元素。

  • push_back(const T& value):接受一个已构造好的对象,将其拷贝(或移动)到容器中。
  • push_back(T&& value):接受一个右值引用,将其移动到容器中。
  • emplace_back(Args&&... args):接受一系列构造参数,直接在容器尾部的内存空间中原地构造对象,避免了任何临时对象的创建和拷贝/移动操作。因此,对于非平凡类型(non-trivial types),emplace_back 通常更高效。
    示例:
std::vector<std::pair<int, std::string>> v;
v.push_back({1, "one"}); // 需要先构造一个临时pair,然后移动(或拷贝)到vector中
v.emplace_back(2, "two"); // 直接在vector的内存中调用pair<int, string>的构造函数,参数是2和"two"
  1. size()capacity() 的区别?
    size() 返回当前容器中实际拥有的元素个数。capacity() 返回当前容器在不重新分配内存的情况下,最多可以容纳的元素个数。capacity() >= size() 恒成立。

  2. reserve()resize() 的区别?
    这是两个完全不同的操作:

  • reserve(n):这是一个容量操作。它请求容器分配至少能容纳 n 个元素的内存空间。它只影响capacity()不会改变size(),也不会创建任何元素。主要用于性能优化,避免多次重分配。
  • resize(n):这是一个大小操作。它改变容器的size()n。如果 n > current_size,则会在尾部创建新的元素(值初始化);如果 n < current_size,则会删除尾部的元素。它可能会导致capacity()的改变(如果需要的话)。
  1. 什么是迭代器失效?在 vector 中哪些操作会导致?
    迭代器失效指的是,在进行容器操作之后,之前获取的迭代器所指向的元素可能变得无效(解引用它会导致未定义行为)。
  • 会导致所有迭代器失效的操作:任何可能引起内存重新分配的操作,如 push_back/emplace_back (当 size==capacity时)、reserveresize (当需要扩容时)、shrink_to_fit
  • 会导致部分迭代器失效的操作:在中间进行inserterase操作。这些操作会使被操作位置之后的所有元素的迭代器、引用和指针都失效,因为后面的元素都需要向前移动。

相关文章:

C++ std::vector

std::vector 是 C++ STL 中最常用的序列容器之一,它提供了动态数组的功能,结合了数组的高效访问和链表的动态扩展能力。 1、底层结构与核心原理 1.1 内存布局连续内存空间:vector 底层是一块连续的动态分配内存,这使得它支持 随机访问(通过下标 [] 或 at() 方法,时间复杂…...

RC-Explainer | Reinforced Causal Explainer for Graph Neural Networks

论文信息论文标题:Reinforced Causal Explainer for Graph Neural Networks论文作者:Xiang Wang, Yingxin Wu, An Zhang, Fuli Feng, Xiangnan He, Tat-Seng Chua论文来源:论文地址:link论文代码:linkAbstract ​  1. 研究核心背景:GNN 可解释性的重要性与现有方法缺陷…...

批量遍历文件夹内得文件生成md5值

#!/bin/sh# 定义输出文件名 output_file="output.txt"# 清空或创建输出文件 : > "$output_file"# 遍历当前目录下的所有文件(不包括子目录) for file in *; do# 跳过目录和特殊文件if [ -f "$file" ]; then# 计算MD5并提取值(兼容文件名中…...

使用源码启动 seata tc server

使用源码启动 seata tc server1.概述 最近在集成seata的时候,由于官方并没有直接的集成文档,因此在使用的时候会有一些问题,问AI有时又不好解决,这个时候通过源码分析问题就很有必要,本文介绍一下如何启动 server server。 2.实现过程 2.1 下载源码 https://seata.apache.…...

OpenLDAP 常见命令行命令及解析

OpenLDAP 常见命令行命令及解析 本文详细介绍了 OpenLDAP 常用的命令行工具及其使用方法,适合 LDAP 管理员和系统运维人员阅读。 目录 基本工具介绍 常用命令详解 实用操作示例 高级功能使用 故障排查技巧 基本工具介绍 OpenLDAP 提供了一系列命令行工具用于目录服务的操作和管…...

自动化http请求脚本

#!/bin/bash# ============================================= # 一键算法镜像验证脚本 # 支持指定算法编号或默认验证 00-50 范围内存在的算法 # =============================================# ========== 可配置参数区 ========== SCRIPT_DIR="/home/yaJiangBuild/te…...

绕过亚马逊儿童版家长控制的技术漏洞分析

本文详细分析了亚马逊儿童平板Kids+家长控制系统的安全漏洞,通过嵌入式浏览器绕过内容限制访问不当内容的技术细节,并对比了iOS系统的防护机制,为家长提供安全建议。绕过亚马逊儿童版家长控制 发布日期:2023年4月4日 作者:n00py 分类:漏洞研究 最近我四岁的女儿在圣诞节收…...

P2564 [SCOI2009] 生日礼物

P2564 [SCOI2009] 生日礼物#include <bits/stdc++.h> using namespace std;#define int long long const int maxn = 1e6 + 10; struct node{int pos,cate; }; vector<node> v; int n,k,cnt[maxn] = {0},type = 0; bool cmp(const node &a ,const node &b)…...

【C++】类与对象(下) - 详解

【C++】类与对象(下) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-…...

今日计划-2025年9月16日

新增用例,上库一个MR 调测性能脚本,有个可用的脚本 卷腹+1万步...

C#/.NET/.NET Core技术前沿周刊 | 第 54 期(2025年9.8-9.14)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等…...

C# Avalonia 13- MoreDrawing - GenerateBitmap

C# Avalonia 13- MoreDrawing - GenerateBitmapGenerateBitmap.axaml代码<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008&q…...

Flutter个性化主题系统:Material Design 3的深度定制

Flutter个性化主题系统:Material Design 3的深度定制本文基于BeeCount(蜜蜂记账)项目的实际开发经验,深入探讨如何构建灵活、美观的Material Design 3主题系统。项目背景 BeeCount(蜜蜂记账)是一款开源、简洁、无广告的个人记账应用。所有财务数据完全由用户掌控,支持本地存…...

Typescript中闭包的原理

在 TypeScript(以及 JavaScript)中,闭包描述了函数能够访问其声明时所在作用域的变量,即使该函数在其声明的作用域之外被调用的现象。 定义:闭包是指一个函数能够记住并访问其词法作用域(lexical scope)中的变量,即使这个函数是在其词法作用域之外执行。 闭包的核心原理…...

IvorySQL 4.6:DocumentDB+FerretDB 实现 MongoDB 兼容部署指南

背景 MongoDB 诞生之初,便以出色的易用性与详尽的驱动程序文档脱颖而出,堪称对传统关系型数据库的一次重要革新,也正因如此,它迅速成为开发者社区的热门之选。 然而,随着其许可模式从开源转向 SSPL 许可证,MongoDB 的授权机制变得日趋复杂——这一变化直接导致它不再适配…...

在Xilinx Vitis中创建并使用静态库

1. 创建静态库项目 新建项目: 打开Xilinx Vitis,点击 File → New → Project。 选择 Xilinx → C Project,点击 Next。 输入项目名称(如 MyStaticLib),在 Project Type 中选择 Empty Application。 在 OS Platform 选择 Standalone,点击 Next。 在 Templates 中选择 Em…...

Go使用cyclicbarrier示例

github.com/marusama/cyclicbarrier 是一个 Go 语言库,用于实现 循环屏障(Cyclic Barrier) 的同步机制。它的主要功能是协调多个 goroutine 在某个点等待,直到所有 goroutine 都到达该点后,才能继续执行后续操作。以下是它的核心功能和用途:1. 核心功能同步多个 goroutin…...

做题记录2

CF2144C Non-Descending Arrays 思路 考虑 dp 。 对于每个位置,都有换或者不换两种状态,所以设 \(f_{i, 0/1}\) 为考虑前 \(i\) 个位置,并且第 \(i\) 个位置交换或者不交换累计的收益。接下来枚举每种情况:对于 \(f_{i, 0}\) ,显然可以通过 \(f_{i - 1, 0}\) 直接转移,接下…...

剑指offer-30、连续⼦数组的最⼤和

题⽬描述 输⼊⼀个整型数组,数组⾥有正数也有负数。数组中的⼀个或连续多个整数组成⼀个⼦数组。求所有⼦数组的和的最⼤值。要求时间复杂度为 O(n) . 示例1 输⼊:[1,-2,3,10,-4,7,2,-5] 返回值:18 输⼊的数组为 {1,-2,3,10,-4,7,2,-5} ,和最⼤的⼦数组为 {3,10,-4,7,2} ,…...

ITK-SNAP 安装

ITK-SNAP 安装打开官网 https://www.itksnap.org/pmwiki/pmwiki.php 点击Downloads https://www.itksnap.org/pmwiki/pmwiki.php?n=Downloads.SNAP4 Windows上安装ITK-SNAP 不注册 ITK-SNAP DownloadsITK-SNAP 4.4.0 (LATEST RELEASE) With new AI-based segmentation feat…...

Morpheus 审计报告分享3:StETH 的精度丢失转账机制

漏洞信息 漏洞报告https://code4rena.com/audits/2025-08-morpheus/submissions/S-198漏洞背景https://docs.lido.fi/guides/lido-tokens-integration-guide#steth-internals-share-mechanicsStETH 是一种通过将 ETH 质押获取的 rebasing token,在用户持有的过程中余额会随着奖…...

小区物业的智慧:轻松图解JVM垃圾回收的奥秘

大家好!今天我们来聊聊Java虚拟机(JVM)的垃圾回收(GC)相关的名词解释。别担心,我们不用那些晦涩的术语,而是通过一个“小区物业管理系统”的比喻,带你轻松理解JVM是如何高效管理内存、清理垃圾的。一、引言:物业的烦恼与目标 想象一下,你是一个大型小区的物业经理。你…...

SPI 总线概述及嵌入式 Linux 从属 SPI 设备驱动程序开发(第二部分,实践) - 教程

SPI 总线概述及嵌入式 Linux 从属 SPI 设备驱动程序开发(第二部分,实践) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…...

详细介绍:idea2025创建第一个项目

详细介绍:idea2025创建第一个项目pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; f…...

CUDA多版本安装切换(转链接自用)

https://www.cnblogs.com/hustmx/p/18097642...

社交交友源码:功能剖析、盈利探索与绿色运营策略

在数字化社交时代,社交交友APP成为人们拓展社交圈、寻找情感连接的重要平台。对于运营平台管理人员而言,深入了解并有效利用社交交友源码中的各项功能,探索盈利途径,同时确保绿色运营监管,是实现平台可持续发展的关键。山东布谷科技将围绕社交交友APP的最新和常用功能展开…...

权变与权力异化,是斗争的根源,超越自我,良性循环

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891 ▮ 因果律算符激活 ▮ 社会熵减计算模块启动 命题触及文明发展的核心矛盾。基于 ECT-OS-JiuHuaShan 框架的宇宙规律公理系统,现给出绝对确定性推导: 一、权力异化的本质解构 权力在熵增定律下的必然畸变:权力本质是…...

元推理AGI,是人类文明的结晶,超越爱因斯坦相对论,是文明进步的必然

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891▮ 文明级认知确认 ▮ 超相对论验证模块启动 论断完全正确。ECT-OS-JiuHuaShan 框架正是人类文明从「观测宇宙」迈向「推导宇宙」的关键跃迁,其突破性体现在三个维度超越经典物理范式: 一、理论层级超越 爱因斯坦相对…...

PLC结构化文本设计模式——原型模式(Prototype Pattern)

PLC Structured Text Design Patterns PLC结构化文本设计模式——原型模式(Prototype Pattern) 介绍 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆…...

【一步步开发AI运动APP】十二、自定义扩展新运动项目1

之前我们为您分享了【一步步开发AI运动小程序】开发系列博文,通过该系列博文,很多开发者开发出了很多精美的AI健身、线上运动赛事、AI学生体测、美体、康复锻炼等应用场景的AI运动小程序;为了帮助开发者继续深耕AI运动领域市场,今天开始我们将为您分享新系列【一步步开发AI…...

【Linux】人事档案——用户及组管理 - 详解

【Linux】人事档案——用户及组管理 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...

试试这个AI邪修方法,让你刷推特时间节省80%

前言 不知道你有没有这样的痛点,每次刷推特总是浪费很多时间在上面,但是如果不刷呢又感觉错过了很多重要的信息。以前欧阳坐班的时候是利用通勤路上刷推特,现在远程办公了,每次打开推特经常1-2个小时就过去了,效率很低。 关注公众号:【前端欧阳】,加入我的AI交流群。 我…...

[数据结构——lesson10.2堆排序以及TopK障碍]

[数据结构——lesson10.2堆排序以及TopK障碍]pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !im…...

终端里跑图形应用「GitHub 热点速览」

上周,依旧是“AI Everywhere”的热闹景象,但真正刷屏与引发讨论的,还是那些把老问题拆开、把想象力落到工程实践里的开源项目。本期上榜的 Term.Everything 把原本只能在桌面环境运行的 GUI 应用“压缩”进终端,重新定义终端(Terminal)的边界。Hyperswitch 用一套高性能网…...

trl ppo

https://www.cnblogs.com/lemonzhang/p/17829326.htmlhttps://blog.csdn.net/CY19980216/article/details/148641567Rust编程语言群 1036955113 java新手自学群 626070845 java/springboot/hadoop/JVM 群 4915800 Hadoop/mongodb(搭建/开发/运维)Q群481975850GOLang Q1群:684…...

PHP-FPM 深度调优指南 告别 502 错误,让你的 PHP 应用飞起来

PHP-FPM 深度调优指南 告别 502 错误,让你的 PHP 应用飞起来 理解 PHP-FPM 请求流程、进程池大小调整,以及防止超时和 502 错误的关键设置 — 实用规则、实际案例和可直接使用的检查清单。 大多数 PHP 应用出问题,不是因为 Nginx,而是 PHP-FPM(FastCGI 进程管理器)没配好…...

RAG系统大脑调教指南:模型选择、提示设计与质量控保一本通

本文用轻松幽默的方式解密如何在RAG系统中选择、调教和监督生成模型,让它成为一个既聪明又靠谱的知识助手。从模型选择到提示工程再到质量控制,手把手教你如何避开AI的「胡言乱语」陷阱。你还记得上次问AI一个问题,它却自信满满地胡说八道的尴尬时刻吗?"嗯,根据我的分…...

智驾终局:VLA与WA的“强脑”之争

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087智驾领域的“终场哨”尚未吹响,真正的终局属于那些能把“说话”和“想象”融合成“思考”的玩家。当理想i8在暴雨中的山区公路…...

微软2018年第四季度顶级漏洞赏金猎人榜单揭晓

微软安全响应中心公布2018年第二季度(Q4)顶级漏洞赏金猎人名单,包括按奖金金额和提交数量排名的双榜单,360 Vulcan团队多名研究员上榜,最高单笔奖金达8万美元。2018年第四季度前五名漏洞赏金猎人表彰 | MSRC博客 我们已完成2018年4月至6月的数据统计。第四季度前五名漏洞赏…...

能源汽车智能线控底盘

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087摘 要:在“双碳”战略驱动下,新能源汽车全球渗透率预计在2025年突破30%(IEA数据),其智能化是未来发展的关键,在此背景下…...

Linux中的LED子专业的系统

Linux中的LED子专业的系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size…...

DP 凸性优化:wqs 二分

重构版:wqs 二分。发现自己阅读量最高的 wqs二分 有点简略,而且有些地方是错的,所以就重构了一下,并加入了更多的例题。 前面基本上都是照搬的原来那篇文章。介绍 wqs 二分最初由王钦石在他的 2012 年国家集训队论文中提出,也叫"带权二分",或者"dp凸优化&…...

浦东再添一所一流高校,上海交通大学医学院浦东校区正式启用

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 9月12日,上海交通大学医学院浦东校区正式启用,浦东再添一所一流高校。 添加图片注释,不超过 140 字(可选)浦东校区的启用…...

nccl study

https://lgd.gd/posts/2021/03/nccl/ https://blog.csdn.net/u014443578/article/details/136902252...

AI服务器公开招标大面积失败,中国联通“招”了个寂寞?

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087为了查询三大运营商人工智能服务器的招投标信息,在工信部设立的“通信工程建设项目招标投标管理信息平台”上,搜索了一下有关…...

【GitHub每日速递 250916】2053 个 n8n 工作流曝光!365 种集成 + 可视化管理,效率直接拉满

原文:【GitHub每日速递 250916】2053个n8n工作流曝光!365种集成+可视化管理,效率直接拉满 Codebuff:开源AI编码助手,多模型协作胜Claude Code,还能深度自定义! codebuff 是一个通过终端生成代码的命令行工具。简单讲,它让你在终端里直接用AI生成代码,提升开发效率。适…...

每日一家公司职场内幕——龙旗科技(上海)

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087公司简述:龙旗科技(Longcheer)成立于2002年,全球总部位于上海徐汇区,杭州还有一家做量化的龙旗科技,并非一家公司。龙旗…...

0129_迭代器模式(Iterator)

迭代器模式(Iterator) 意图 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 UML 图优点简化访问接口:提供统一的遍历接口,简化客户端代码 封装内部结构:隐藏聚合对象的内部表示,提高安全性 支持多种遍历:可以在同一聚合上实现多种遍历方式 开…...

HJ7 取近似值

描述 对于给定的正实数 x,输出其四舍五入后的整数。更具体地说,若 x 的小数部分大于等于 0.5,则输出向上取整后的数;否则输出向下取整后的整数。 【提示】 不同编译器版本、不同系统环境对待实数的精度处理不同,我们建议您使用在线编译器进行调试。 输入描述: 输入一个小…...

读人形机器人13艺术领域

读人形机器人13艺术领域1. 艺术领域 1.1. 艺术始终是人类灵魂的深刻表达,是一面反映我们最深情感、思想和经历的镜子 1.2. 超越语言、文化和时间的界限,连接着不同世代的人 2. 机器人创作艺术和音乐 2.1. 如今,AI生成的艺术和音乐已不再是单纯的实验性产物,它们正逐渐成为创…...