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

C++ vector容器总结

vector基本概念功能vector数据结构和数组非常相似也称为单端数组vector与普通数组区别不同之处在于数组是静态空间而vector可以动态扩展动态扩展并不是在原空间之后续接新空间而是找更大的内存空间然后将原数据拷贝新空间释放原空间Vector 容器的迭代器是支持随机访问的迭代器vector构造函数功能描述创建vector容器函数原型vectorT v; //采用模板实现类实现默认构造函数vector(v.begin(), v.end()); //将v(begin(), end())区间中的元素拷贝给本身注意右边是开区间vectorintv2 (v1.begin(),v1.end())vector(n, elem); //构造函数将n个elem拷贝给本身vectorintv3 (10,100)vector(const vector vec); //拷贝构造函数vector赋操作功能描述给vector容器进行赋值函数原型vector operator(const vector vec); //重载等号操作符assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身注意右边是开区间vectorintv3;v3.assign(v1.begin(),v1.end());assign(n, elem); //将n个elem拷贝赋值给本身v3.assign(10,100)vector的赋值方式比较简单使用 operator或者assign都可以1.使用赋值运算符最常用int main() { std::vectorint a {1, 2, 3, 4, 5}; std::vectorint b; // 直接赋值深拷贝 b a; std::cout b 的内容: ; for (int val : b) { std::cout val ; } // 输出: 1 2 3 4 5 return 0; }2.使用assign()成员函数int main() { std::vectorint a {1, 2, 3, 4, 5}; std::vectorint b; // 方法1复制整个区间 b.assign(a.begin(), a.end()); // 方法2直接复制整个容器与上面等效 // b.assign(a.begin(), a.end()); std::cout b 的内容: ; for (int val : b) { std::cout val ; } // assign 也可以用于部分复制 std::vectorint c; c.assign(a.begin() 1, a.begin() 4); // 复制索引1-3: {2,3,4} std::cout \nc 的内容: ; for (int val : c) { std::cout val ; } return 0; }3.使用构造函数直接初始化int main() { std::vectorint a {1, 2, 3, 4, 5}; // 方法1拷贝构造 std::vectorint b(a); // 方法2使用迭代器范围 std::vectorint c(a.begin(), a.end()); // 方法3使用赋值初始化 std::vectorint d a; std::cout b: ; for (int val : b) std::cout val ; std::cout \nc: ; for (int val : c) std::cout val ; std::cout \nd: ; for (int val : d) std::cout val ; return 0; }4.使用swap()交换高效int main() { std::vectorint a {1, 2, 3, 4, 5}; std::vectorint b; // swap 交换内容O(1) 时间复杂度 b.swap(a); // 现在 b 有数据a 变为空 std::cout b 的内容: ; for (int val : b) std::cout val ; std::cout \na 的内容: ; for (int val : a) std::cout val ; // 空 // 如果需要保留 a 的内容可以 std::vectorint c; std::vectorint d {6, 7, 8, 9, 10}; c d; // 拷贝 // 或者 std::vectorint e(d); // 拷贝构造 return 0; }5.使用std::copy算法int main() { std::vectorint a {1, 2, 3, 4, 5}; std::vectorint b; // 需要提前分配空间 b.resize(a.size()); std::copy(a.begin(), a.end(), b.begin()); // 或者使用 back_inserter自动增长 std::vectorint c; std::copy(a.begin(), a.end(), std::back_inserter(c)); std::cout b: ; for (int val : b) std::cout val ; std::cout \nc: ; for (int val : c) std::cout val ; return 0; }6.深拷贝 vs 浅拷贝的注意事项#include iostream #include vector int main() { // vectorint 存储的是基本类型深拷贝自动处理 std::vectorint a {1, 2, 3}; std::vectorint b a; // 深拷贝b 有独立的副本 a[0] 100; std::cout a[0] a[0] , b[0] b[0] std::endl; // 输出: a[0] 100, b[0] 1 独立的 // 如果是 vector指针需要注意 std::vectorint* c {new int(1), new int(2)}; std::vectorint* d c; // 拷贝指针不拷贝指向的对象浅拷贝 *c[0] 100; std::cout *c[0] *c[0] , *d[0] *d[0] std::endl; // 输出: *c[0] 100, *d[0] 100 指向同一对象 // 释放内存注意不要重复释放 for (int* p : c) delete p; c.clear(); d.clear(); // d 中的指针已经是悬空指针 return 0; }总结// ✅ 推荐最简洁常用 std::vectorint b a; // 拷贝构造 std::vectorint b; b a; // 赋值运算符 // ✅ 推荐需要部分复制时 b.assign(a.begin() 1, a.begin() 4); // ✅ 推荐不再需要 a 时使用移动语义 b std::move(a); // ⚠️ 可用但较冗长 b.insert(b.end(), a.begin(), a.end()); // ⚠️ 需要提前分配空间不推荐直接使用 b.resize(a.size()); std::copy(a.begin(), a.end(), b.begin());场景推荐方法原因完全复制b a或vectorint b(a)代码简洁性能好部分复制b.assign(a.begin()1, a.end()-1)灵活指定范围移动数据b std::move(a)O(1) 时间复杂度高效追加复制b.insert(b.end(), a.begin(), a.end())保留原有数据使用算法std::copyback_inserter通用性最强vector容量和大小功能描述对vector容器的容量和大小操作函数原型empty(); //判断容器是否为空capacity(); //容器的容量size(); //返回容器中元素的个数resize(int num); //重新指定容器的长度为num若容器变长则以默认值 0 填充新位置。如果容器变短则末尾超出容器长度的元素被删除。resize(int num, elem); //重新指定容器的长度为num若容器变长则以elem值填充新位置。如果容器变短则末尾超出容器长度的元素被删除vector插入和删除功能描述对vector容器进行插入、删除操作函数原型push_back(ele); //尾部插入元素eleemplace_back(ele); //尾部插入元素ele#include iostream #include vector int main() { std::vectorstd::pairint, std::string vec; // push_back: 需要先创建临时对象 vec.push_back(std::make_pair(1, one)); vec.push_back({2, two}); // C11 列表初始化 // emplace_back: 直接传递构造参数在容器内构造 vec.emplace_back(3, three); // 参数直接传给 pair 构造函数 vec.emplace_back(4, four); for (const auto p : vec) { std::cout ( p.first , p.second ) ; } // 输出: (1, one) (2, two) (3, three) (4, four) return 0; }特性push_backemplace_back参数接受对象本身接受构造函数参数临时对象可能创建不创建性能较慢多一次构造更快直接构造适用场景已有对象构造新对象C版本C98C11返回值 (C17)引用引用pop_back(); //删除最后一个元素insert(const_iterator pos, ele)迭代器指向位置pos插入元素elepos位置之前的元素会后移insert(const_iterator pos, int count, ele);迭代器指向位置pos插入count个元素eleerase(const_iterator pos); //删除迭代器指向的元素erase(const_iterator start, const_iterator end); //删除迭代器从start到end之间的元素clear(); //删除容器中所有元素插入单个元素#include vector using namespace std; vectorint vec {1, 2, 3}; // 在指定位置前插入一个元素 vec.insert(vec.begin() 1, 99); // {1, 99, 2, 3} // 返回指向新插入元素的迭代器 auto it vec.insert(vec.begin(), 100); // {100, 1, 99, 2, 3} // it 指向 100插入多个相同元素vectorint vec {1, 2, 3}; // 在位置1前插入3个值为99的元素 vec.insert(vec.begin() 1, 3, 99); // 结果: {1, 99, 99, 99, 2, 3}插入一个范围的元素vectorint vec {1, 2, 3}; vectorint source {10, 20, 30}; // 插入另一个 vector 的全部元素 vec.insert(vec.end(), source.begin(), source.end()); // 结果: {1, 2, 3, 10, 20, 30} // 插入部分元素source 的前2个 vec.insert(vec.begin(), source.begin(), source.begin() 2); // 结果: {10, 20, 1, 2, 3} //2. 使用 insert make_move_iterator (C11高效移动) vectorint a(1); // a [0] vectorint b {2, 3, 4}; // b [2, 3, 4] a.insert(a.end(), std::make_move_iterator(b.begin()), std::make_move_iterator(b.end())); // b 的元素被移动b 变为未指定状态通常为空 //3. 使用 insert 插入位置插入到开头或中间 // 插入到开头 a.insert(a.begin(), b.begin(), b.end()); // 结果: a [2, 3, 4, 0] // 插入到指定位置如第1个元素之后 a.insert(a.begin() 1, b.begin(), b.end()); // 结果: a [0, 2, 3, 4]插入初始化列表 (C11)vectorint vec {1, 2, 3}; // 在位置1前插入初始化列表 vec.insert(vec.begin() 1, {99, 88, 77}); // 结果: {1, 99, 88, 77, 2, 3} // 在末尾插入 vec.insert(vec.end(), {100, 200}); // 结果: {1, 99, 88, 77, 2, 3, 100, 200}vector数据存取功能描述对vector中的数据的存取操作函数原型at(int idx); //返回索引idx所指的数据operator[]; //返回索引idx所指的数据front(); //返回容器中第一个数据元素back(); //返回容器中最后一个数据元素vector互换容器功能描述实现两个容器内元素进行互换函数原型swap(vec); //将vec与本身的元素互换巧用 swap 收缩容器大小#includeiostream #includevector #includestring #includealgorithm using namespace std; int main(){ vectorintv; for(int i 0; i 100000; i){ v.push_back(i); } cout v的容量为 v.capacity() endl; cout v的大小为 v.size() endl; cout ---------------------------------- endl; v.resize(3); cout v的容量为 v.capacity() endl; cout v的大小为 v.size() endl; cout ---------------------------------- endl; vectorint(v).swap(v); cout v的容量为 v.capacity() endl; cout v的大小为 v.size() endl; }输出结果如下可以发现 vectorint(v).swap(v); 这条语句对容器 v 的容量进行压缩这是怎么做到的呢其中 vectorint(v) 表示的是初始化匿名对象。初始化时会按照 v 的大小来初始化匿名对象的大小和容量只不过现在这个匿名对象没有名字。vectorint(v).swap(v) 则会把 v 和 匿名对象 进行交换此时 v 指向的是匿名对象初始化好的容器。而现在匿名对象指向的容器则是之前的 v。根据 C 匿名对象的特性当这条语句执行完后系统会自动回收匿名对象所以匿名对象会被自动销毁我们不需要再管它了。vector预留空间功能描述减少vector在动态扩展容量时的扩展次数函数原型reserve(int len); //容器预留len个元素长度预留位置不初始化元素不可访问。使用reserve()预留容量推荐// 全局定义 vector此时为空容量为0 std::vectorint vec; int main() { int capacity; std::cout 请输入要申请的容量: ; std::cin capacity; // 预留容量不创建元素 vec.reserve(capacity); std::cout vector 容量: vec.capacity() std::endl; std::cout vector 大小: vec.size() std::endl; // 现在可以安全地添加元素不会频繁重新分配 for (int i 0; i capacity; i) { vec.push_back(i); } return 0; }使用resize()改变大小std::vectorint vec; int main() { int size; std::cout 请输入要申请的大小: ; std::cin size; // 改变 vector 大小会创建元素并初始化为0 vec.resize(size); std::cout vector 容量: vec.capacity() std::endl; std::cout vector 大小: vec.size() std::endl; // 直接访问和修改元素 for (int i 0; i size; i) { vec[i] i * 10; } // 打印元素 for (int val : vec) { std::cout val ; } return 0; }使用带参数的构造函数重新赋值std::vectordouble vec; int main() { int capacity; std::cout 请输入要申请的容量: ; std::cin capacity; // 方法1使用赋值操作会替换原有内容 vec std::vectordouble(capacity); // 创建指定大小的临时vector并赋值 // 或方法2使用 swap更高效 // std::vectordouble(capacity).swap(vec); std::cout vector 容量: vec.capacity() std::endl; std::cout vector 大小: vec.size() std::endl; return 0; }关键区别总结方法作用元素数量适用场景reserve(n)预留容量0已知大致数量需要动态添加resize(n)改变大小n需要固定大小可直接访问assign(n, val)重新赋值n需要替换所有元素vectorT(n)构造赋值n完全重新初始化二维 vector 的动态容量申请对于vectorvectorint二维 vector需要分别申请外层和内层的容量。1.基础方法先申请行数再逐行申请列数std::vectorstd::vectorint matrix; int main() { int rows, cols; std::cout 请输入行数: ; std::cin rows; std::cout 请输入列数: ; std::cin cols; // 方法1先预留行容量 matrix.reserve(rows); // 预留行空间 // 然后逐行添加并预留列容量 for (int i 0; i rows; i) { std::vectorint row; row.reserve(cols); // 每行预留列容量 matrix.push_back(row); } std::cout 行数: matrix.size() std::endl; std::cout 每行容量: matrix[0].capacity() std::endl; return 0; }2.使用 resize() 一次性分配#include iostream #include vector std::vectorstd::vectorint matrix; int main() { int rows, cols; std::cout 请输入行数: ; std::cin rows; std::cout 请输入列数: ; std::cin cols; // 方法2直接 resize 行数 matrix.resize(rows); // 然后 resize 每一行的列数 for (int i 0; i rows; i) { matrix[i].resize(cols); } // 或者更简洁的写法 // for (auto row : matrix) { // row.resize(cols); // } std::cout 矩阵大小: matrix.size() x matrix[0].size() std::endl; // 赋值示例 for (int i 0; i rows; i) { for (int j 0; j cols; j) { matrix[i][j] i * cols j; } } return 0; }3.使用构造函数直接初始化最简洁std::vectorstd::vectorint matrix; int main() { int rows, cols; std::cout 请输入行数: ; std::cin rows; std::cout 请输入列数: ; std::cin cols; // 直接创建指定大小的二维 vector matrix std::vectorstd::vectorint(rows, std::vectorint(cols)); // 或者使用 assign // matrix.assign(rows, std::vectorint(cols)); std::cout 矩阵大小: matrix.size() x matrix[0].size() std::endl; // 初始化值 for (int i 0; i rows; i) { for (int j 0; j cols; j) { matrix[i][j] i * j; } } return 0; }方法代码示例适用场景预留空间matrix.reserve(rows);matrix[i].reserve(cols);已知行列数需动态添加,每行申请大小灵活直接 resizematrix.resize(rows);matrix[i].resize(cols);需要固定大小的矩阵构造函数matrix vectorvectorint(rows, vectorint(cols));最简洁推荐使用不规则数组每行单独resize每行列数不同Vector 迭代器高级使用技巧迭代器是访问和操作 vector 的强大工具掌握好迭代器能写出更高效、更优雅的代码。1.基本迭代器类型#include iostream #include vector int main() { std::vectorint vec {1, 2, 3, 4, 5}; // 正向迭代器 std::vectorint::iterator it vec.begin(); // 常量迭代器只读 std::vectorint::const_iterator cit vec.cbegin(); // 反向迭代器 std::vectorint::reverse_iterator rit vec.rbegin(); // 常量反向迭代器 std::vectorint::const_reverse_iterator crit vec.crbegin(); return 0; }2.迭代器遍历技巧#include vector #include iostream int main() { std::vectorint vec {10, 20, 30, 40, 50}; // 传统方式 for (auto it vec.begin(); it ! vec.end(); it) { *it * 2; // 修改元素 std::cout *it ; } // C11 范围 for底层使用迭代器 for (const auto val : vec) { std::cout val ; } // 反向遍历 for (auto rit vec.rbegin(); rit ! vec.rend(); rit) { std::cout *rit ; } // 使用索引不推荐但有时需要 for (size_t i 0; i vec.size(); i) { // 当需要索引时使用 } return 0; }3.迭代器算法应用#include algorithm #include vector #include iostream int main() { std::vectorint vec {5, 2, 8, 1, 9, 3, 7, 4, 6}; // 排序 std::sort(vec.begin(), vec.end()); // 部分排序前5个最小元素排序 std::partial_sort(vec.begin(), vec.begin() 5, vec.end()); // 查找元素 auto it std::find(vec.begin(), vec.end(), 5); if (it ! vec.end()) { std::cout Found at position: std::distance(vec.begin(), it); } // 查找满足条件的元素 it std::find_if(vec.begin(), vec.end(), [](int x) { return x 5; }); // 统计满足条件的元素 int count std::count_if(vec.begin(), vec.end(), [](int x) { return x % 2 0; }); // 反转 std::reverse(vec.begin(), vec.end()); // 旋转 std::rotate(vec.begin(), vec.begin() 3, vec.end()); return 0; }4.迭代器与修改操作#include vector #include iostream int main() { std::vectorint vec {1, 2, 3, 4, 5}; // 删除元素注意迭代器失效 for (auto it vec.begin(); it ! vec.end();) { if (*it % 2 0) { it vec.erase(it); // erase 返回下一个有效迭代器 } else { it; } } // 删除多个连续元素 auto start vec.begin() 1; auto end vec.begin() 3; vec.erase(start, end); // 删除 [1, 3) 范围的元素 // 条件删除C20 的 erase_if // std::erase_if(vec, [](int x) { return x 0; }); // 插入元素 vec.insert(vec.begin() 2, 100); // 在第2个位置后插入 // 原地修改 std::transform(vec.begin(), vec.end(), vec.begin(), [](int x) { return x * 2; }); return 0; }5.迭代器失效处理#include vector int main() { std::vectorint vec {1, 2, 3, 4, 5}; // 危险扩容导致迭代器失效 auto it vec.begin(); vec.push_back(6); // 可能触发重新分配it 变为野指针 // *it 10; // 未定义行为 // 解决方法1预留空间 vec.reserve(100); it vec.begin(); vec.push_back(6); // 安全不会重新分配 // 解决方法2重新获取迭代器 vec.push_back(7); it vec.begin(); // 重新获取 // 删除元素也会使后续迭代器失效 auto it2 vec.begin() 2; vec.erase(vec.begin()); // 删除第一个元素 // it2 可能失效 // 插入元素可能导致所有迭代器失效如果需要重新分配 return 0; }6.高级迭代器技巧迭代器适配器#include iterator #include algorithm #include vector int main() { std::vectorint source {1, 2, 3, 4, 5}; std::vectorint dest; // 使用 back_inserter std::copy(source.begin(), source.end(), std::back_inserter(dest)); // 使用 front_inserter需要 deque std::dequeint dq; std::copy(source.begin(), source.end(), std::front_inserter(dq)); // 输出到 cout std::copy(source.begin(), source.end(), std::ostream_iteratorint(std::cout, , )); // 移动迭代器 std::vectorstd::string strs {hello, world}; std::vectorstd::string moved; std::move(strs.begin(), strs.end(), std::back_inserter(moved)); return 0; }自定义迭代器操作#include vector #include iostream int main() { std::vectorint vec {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 跳跃遍历 for (auto it vec.begin(); it vec.end(); it 2) { std::cout *it ; // 1, 3, 5, 7, 9 } // 处理相邻元素 for (auto it vec.begin(); it 1 ! vec.end(); it) { int sum *it *(it 1); } // 二分查找需要排序 std::sort(vec.begin(), vec.end()); auto it std::lower_bound(vec.begin(), vec.end(), 5); auto it2 std::upper_bound(vec.begin(), vec.end(), 7); // 获取子范围 std::vectorint subvec(it, it2); return 0; }7.安全区间的处理#include vector #include iostream templatetypename T class SafeIterator { public: using iterator typename std::vectorT::iterator; // 安全的元素访问 static T get(const std::vectorT vec, size_t index) { if (index vec.size()) { throw std::out_of_range(Index out of range); } return vec[index]; } // 安全的下一个元素 static iterator safe_next(iterator it, iterator end) { if (it end) return end; return it; } // 安全的前一个元素 static iterator safe_prev(iterator it, iterator begin) { if (it begin) return begin; return --it; } }; int main() { std::vectorint vec {1, 2, 3}; // 边界检查 if (vec.begin() 2 vec.end()) { // 安全的访问 } return 0; }8.性能优化技巧#include vector int main() { std::vectorint vec(1000, 0); // 好使用迭代器避免重复调用 vec.size() for (auto it vec.begin(); it ! vec.end(); it) { *it 42; } // 好使用指针算术 int* ptr vec.data(); for (size_t i 0; i vec.size(); i) { ptr[i] i; } // 避免每次循环都调用 end() // for (auto it vec.begin(); it ! vec.end(); it) // end() 每轮都计算 // 优化缓存 end() for (auto it vec.begin(), end vec.end(); it ! end; it) { // end() 只计算一次 } return 0; }关键要点优先使用迭代器而不是索引更通用、更符合 STL 设计理念注意迭代器失效改变容器大小或结构会使迭代器失效使用 const 迭代器只读操作时使用cbegin()/cend()距离计算使用std::distance()而不是it2 - it1提前缓存 end()在循环中避免重复调用

相关文章:

C++ vector容器总结

vector基本概念功能:vector数据结构和数组非常相似,也称为单端数组vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间&a…...

交流电机驱动器的三种控制模式:前沿切相、后沿切相与同步模式详解

1. 项目概述:一个能玩出花的交流电机驱动器在汽车改装、工业控制或者一些创客项目里,驱动一个交流电机听起来简单,但想让它听话地变速、正反转,甚至实现软启动和精确同步,往往就得搬出笨重又昂贵的工业变频器。今天分享…...

phpMyAdmin CVE-2018-12613:从文件读取到RCE的伪协议利用链

1. 这个漏洞不是“能读文件”那么简单,而是后台权限的彻底失守phpMyAdmin 4.8.1里那个CVE-2018-12613,很多人扫到就报个“存在文件包含”,顺手贴个?targetphp://filter/convert.base64-encode/resource/etc/passwd截图完事。我去年在给一家教…...

<背包问题>

背包问题是一类组合优化问题,其基本形式是给定一组物品,每个物品都有一个重量和一个价值,以及一个有限的背包容量,目标是在不超过背包容量的前提下,选择物品使得背包中的物品价值最大化。动态规划是解决背包问题的常用…...

基于雷达与光敏传感器的低功耗智能窗防设备设计与实现

1. 项目概述:一个基于雷达与光敏的智能窗防设备几年前,我因为一次短暂的出差,家里空置了几天,回来后就一直琢磨着怎么给家里的窗户加点“动静”。市面上的智能安防摄像头固然好,但要么需要复杂的布线,要么云…...

武汉国电华美16875kVA串联谐振试验装置,这手活儿细

在超高压变电站和长距离电缆的现场,交流耐压试验是检验设备绝缘的“最后一关”。这位老师傅经手过不少大工程,他说,面对GIS、大型变压器这些“大块头”电容性试品,能不能顺利“过关”,往往就看串联谐振装置顶不顶得住。…...

武汉国电华美串联谐振试验装置,现场用着心里有底

在高压试验现场干了这么多年,这位老师傅常说,一台好的串联谐振装置,就是试验人员的胆。面对GIS、大型变压器、超高压电缆这些大电容试品,没有趁手的谐振设备,交流耐压试验根本没法干。16875kVA/225kV这个规格&#xff…...

OmenSuperHub:释放惠普游戏本性能的纯净开源控制中心

OmenSuperHub:释放惠普游戏本性能的纯净开源控制中心 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 还在为官方…...

收藏干货|2026 版企业 AI 落地实操指南,程序员小白入门避坑必备

如今人工智能早已脱离概念炒作阶段,全面扎根企业实际业务场景,成为技术从业者与企业管理者无法回避的发展课题。各行各业都加速布局AI赛道,行业心态也从初期观望试探,彻底转变为实打实的落地攻坚。 不少企业高层主动牵头统筹AI规划…...

浏览器指纹识别机制深度剖析与反识别技术实现

一、浏览器指纹技术基础认知1.1 浏览器指纹的核心定义在数字化时代,每一台接入互联网的设备都会留下独特的数字标识,浏览器指纹便是其中最关键的识别凭证之一。浏览器指纹是网站通过 JavaScript 脚本、HTTP 请求头、硬件接口调用等多种技术手段&#xff…...

Gazebo Sim多旋翼控制:四轴飞行器动力学建模与PID调参

Gazebo Sim多旋翼控制:四轴飞行器动力学建模与PID调参 【免费下载链接】gz-sim Open source robotics simulator. The latest version of Gazebo. 项目地址: https://gitcode.com/gh_mirrors/gz/gz-sim Gazebo Sim是一款功能强大的开源机器人模拟器&#xff…...

sngan_projection论文解读:ICLR2018两大GAN技术的完美结合

sngan_projection论文解读:ICLR2018两大GAN技术的完美结合 【免费下载链接】sngan_projection GANs with spectral normalization and projection discriminator 项目地址: https://gitcode.com/gh_mirrors/sn/sngan_projection sngan_projection是一个实现了…...

如何快速上手DeepPurpose?5分钟完成你的第一个药物-靶点相互作用预测模型

如何快速上手DeepPurpose?5分钟完成你的第一个药物-靶点相互作用预测模型 【免费下载链接】DeepPurpose A Deep Learning Toolkit for DTI, Drug Property, PPI, DDI, Protein Function Prediction (Bioinformatics) 项目地址: https://gitcode.com/gh_mirrors/de…...

终极Node.js Mock工具:Mockery入门到精通实战教程

终极Node.js Mock工具:Mockery入门到精通实战教程 【免费下载链接】mockery Simplifying the use of mocks with Node.js 项目地址: https://gitcode.com/gh_mirrors/mock/mockery Mockery是Node.js生态中简化Mock使用的终极工具,它为开发者提供了…...

Hindsight API参考:REST接口完整文档

Hindsight API参考:REST接口完整文档 【免费下载链接】hindsight Hindsight: Agent Memory That Learns 项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight Hindsight是一个强大的Agent Memory系统,提供了全面的REST API接口&…...

CUDA并行计算与FSR框架优化实践

1. CUDA并行计算与FSR框架概述在GPU加速计算领域,CUDA(Compute Unified Device Architecture)作为NVIDIA推出的并行计算平台和编程模型,已经成为高性能计算的事实标准。其核心设计理念是将计算任务分解为网格(Grid&…...

Claude SWOT分析(内部风控文档流出版):3类高危使用场景+2个监管红线预警

更多请点击: https://intelliparadigm.com 第一章:Claude SWOT分析(内部风控文档流出版):3类高危使用场景2个监管红线预警 高危使用场景识别 在企业级AI应用中,Claude模型若未经严格风控适配,…...

如何快速掌握Avidemux:新手完整入门指南与5个核心技巧

如何快速掌握Avidemux:新手完整入门指南与5个核心技巧 【免费下载链接】avidemux2 Avidemux2, simple video editor 项目地址: https://gitcode.com/gh_mirrors/avi/avidemux2 Avidemux是一款功能强大且完全开源的专业视频编辑工具,专为快速剪辑、…...

WTF Auto Layout? 实战:10个常见约束冲突案例解析与解决方案

WTF Auto Layout? 实战:10个常见约束冲突案例解析与解决方案 【免费下载链接】wtfautolayout The source code for Why The Failure, Auto Layout? 项目地址: https://gitcode.com/gh_mirrors/wt/wtfautolayout 在iOS开发中,Auto Layout是构建灵…...

Atomic Layout核心概念解析:Composition组件如何实现布局与间距分离的终极指南

Atomic Layout核心概念解析:Composition组件如何实现布局与间距分离的终极指南 【免费下载链接】atomic-layout Build declarative, responsive layouts in React using CSS Grid. 项目地址: https://gitcode.com/gh_mirrors/at/atomic-layout Atomic Layout…...

基于USB ACA模式实现安卓手机边玩边充的游戏手柄设计

1. 项目缘起:当手机性能过剩,却败给了触摸屏几年前,我清理手机游戏时,发现一个挺无奈的现象:性能足以媲美掌机的智能手机里,只剩下一些慢节奏的平台解谜或者数独。那些曾经让我在掌机上废寝忘食的赛车、动作…...

3分钟解锁网易云音乐NCM文件:ncmdumpGUI小白也能懂的完整教程

3分钟解锁网易云音乐NCM文件:ncmdumpGUI小白也能懂的完整教程 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经下载了网易云音乐的歌曲&a…...

Qri高级功能:如何使用JSON Schema验证和描述数据集结构

Qri高级功能:如何使用JSON Schema验证和描述数据集结构 【免费下载链接】qri youre invited to a data party! 项目地址: https://gitcode.com/gh_mirrors/qr/qri Qri是一个强大的开源数据协作工具,它提供了丰富的功能来帮助用户管理、共享和验证…...

Raspberry Pi Debug Probe:RP2040嵌入式开发的调试利器与实战指南

1. 项目概述:为什么你需要一个Raspberry Pi Debug Probe?如果你玩过树莓派Pico或者任何基于RP2040芯片的开发板,肯定遇到过这样的场景:写好的代码,点一下“上传”,然后……就没有然后了。板子上的LED没按你…...

基于Netburner NANO54415构建工业级嵌入式Web服务器:从硬件选型到广域监控实战

1. 项目概述:一个为广域与本地监控而生的嵌入式Web服务器如果你正在寻找一个能部署在野外、工厂角落或者任何需要远程数据采集与控制场景下的嵌入式Web服务器方案,并且对市面上那些要么性能孱弱、要么开发门槛极高的开发板感到厌倦,那么这个基…...

Jupyter Notebook里跑argparse脚本总报错?一个空列表参数搞定ipykernel_launcher.py error

Jupyter Notebook中argparse报错的终极解决方案:空列表参数实战解析在数据科学和机器学习的工作流中,Jupyter Notebook因其交互式特性成为众多研究者的首选工具。然而,当我们尝试在Notebook中运行那些原本为命令行设计的Python脚本时&#xf…...

开源ELM327 OBD-II适配器:从硬件设计到多协议固件实现全解析

1. 项目概述:开源ELM327 OBD适配器如果你对汽车诊断、数据监控或者嵌入式开发感兴趣,那么自己动手做一个OBD-II适配器绝对是个能让你学到很多东西的硬核项目。今天要聊的,就是一个完全开源的、基于NXP LPC1517微控制器的ELM327兼容OBD适配器。…...

RevSSH反向SSH隧道:无公网IP设备的安全远程运维方案

1. 这不是又一个SSH封装工具——RevSSH解决的是“根本性连接悖论”你有没有遇到过这样的场景:一台部署在客户内网的嵌入式设备,没有公网IP,NAT穿透失败,防火墙策略死死锁住所有入向端口,连ICMP都被禁了;或者…...

从安装到排错:手把手解决Linux服务器上Nacos启动失败的十大常见问题

从安装到排错:手把手解决Linux服务器上Nacos启动失败的十大常见问题当你在Linux服务器上部署Nacos时,是否遇到过启动失败却无从下手的困境?作为阿里巴巴开源的服务发现和配置管理平台,Nacos在微服务架构中扮演着重要角色。然而&am…...

手把手教你用Mind+和Blynk,让手机轻松遥控掌控板(含自建服务器避坑指南)

从零搭建物联网控制平台:Mind与Blynk深度整合实战 当你第一次尝试用手机控制硬件设备时,那种"隔空取物"的奇妙感总会让人兴奋不已。想象一下,躺在沙发上就能调节书桌上的智能台灯亮度,或者在外出时随时查看家中的温湿度…...