目录

前言

STL容器一览

set和map如何降序构建

set和map如何插入自定义对象

multiset和multimap如何降序构建

multiset和multimap如何插入自定义对象

multi_系列如何equal_range

  multiset

        multimap

        unorder_multiset

        unorder_multimap

STL容器迭代器一览

迭代器性能一览

 copy()

ostream_iterator

reverse_iterator

insert_iterator系列

for_each

set_union

remove_if

transform

list.remove

string.find

string.substr

算法组

tolower

toupper

next_permutation

unique

count_if

bitset:用于将整数转化为二进制

后续


前言

        君子生非异也,善假与物也。本文着重于讲解在做leetcode和牛客题目时,会较为经常用到的容器、容器方法和通用算法,使我们在做题时,可以得心应手。在不断的学习方法中,我们实际上还能更进一步理解c++的各种编程思想。但是本文是基于你已经做了许多题目,已经有所实践的基础上。如果你连十道题都没做过,那你暂时无法体会本文所讲的内容或者说所讲内容的意义。

STL容器一览

set和map如何降序构建

        set降序构建

#include <iostream>
#include <set>int main() {// 建立降序setstd::set<int, std::greater<int>> descendingSet;// 插入元素descendingSet.insert(5);descendingSet.insert(3);descendingSet.insert(7);descendingSet.insert(1);// 遍历输出for (int num : descendingSet) {std::cout << num << " ";}// 输出结果为:7 5 3 1return 0;
}

        map降序构建

#include <iostream>
#include <map>int main() {// 建立降序mapstd::map<int, std::string, std::greater<int>> descendingMap;// 插入元素descendingMap.insert({10, "apple"});descendingMap.insert({5, "banana"});descendingMap.insert({15, "cherry"});// 遍历输出for (const auto& pair : descendingMap) {std::cout << pair.first << ": " << pair.second << std::endl;}// 输出结果为:// 15: cherry// 10: apple// 5: bananareturn 0;
}

set和map如何插入自定义对象

        set插入自定义对象

#include <iostream>
#include <set>
#include <string>class Person {
public:std::string name;int age;Person(const std::string& n, int a) : name(n), age(a) {}
};// 自定义比较函数对象
struct PersonComparator {bool operator()(const Person& a, const Person& b) const {if (a.age!= b.age) {return a.age < b.age;}return a.name < b.name;}
};int main() {std::set<Person, PersonComparator> people;people.insert(Person("Alice", 25));people.insert(Person("Bob", 20));people.insert(Person("Charlie", 25));for (const auto& person : people) {std::cout << "Name: " << person.name << ", Age: " << person.age << std::endl;}return 0;
}

        map插入自定义对象

#include <iostream>
#include <map>
#include <string>class StudentID {
public:int id;std::string school;StudentID(int i, const std::string& s) : id(i), school(s) {}
};// 自定义比较函数对象
struct StudentIDComparator {bool operator()(const StudentID& a, const StudentID& b) const {if (a.id!= b.id) {return a.id < b.id;}return a.school < b.school;}
};int main() {std::map<StudentID, std::string, StudentIDComparator> studentNames;studentNames[StudentID(1, "SchoolA")] = "Alice";studentNames[StudentID(2, "SchoolB")] = "Bob";studentNames[StudentID(1, "SchoolC")] = "Charlie";for (const auto& pair : studentNames) {std::cout << "ID: " << pair.first.id << ", School: " << pair.first.school<< ", Name: " << pair.second << std::endl;}return 0;
}

multiset和multimap如何降序构建

        与set和map如何降序构建一致

multiset和multimap如何插入自定义对象

        与set和map如何插入自定义对象一致

multi_系列如何equal_range

        equal_range返回一个std::pair,其中.first指向范围的起始位置,是一个迭代器,.second指向范围的结束位置(最后一个匹配元素的下一个位置),是一个迭代器。如果没有找到与键 k 相等的元素,.first 和 .second 都等于 end(),即超尾迭代器。 

  multiset

#include <iostream>
#include <set>int main() {std::multiset<int> numbers;numbers.insert(5);numbers.insert(3);numbers.insert(5);numbers.insert(7);numbers.insert(5);auto range = numbers.equal_range(5);for (auto it = range.first; it!= range.second; ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

        multimap

#include <iostream>
#include <map>
#include <string>int main() {std::multimap<int, std::string> idNames;idNames.insert({1, "Alice"});idNames.insert({2, "Bob"});idNames.insert({1, "Charlie"});idNames.insert({3, "David"});auto range = idNames.equal_range(1);for (auto it = range.first; it!= range.second; ++it) {std::cout << "ID: " << it->first << ", Name: " << it->second << std::endl;}return 0;
}

        unorder_multiset

#include <iostream>
#include <unordered_set>int main() {std::unordered_multiset<int> numbers;numbers.insert(5);numbers.insert(3);numbers.insert(5);numbers.insert(7);numbers.insert(5);auto range = numbers.equal_range(5);for (auto it = range.first; it != range.second; ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

        unorder_multimap

#include <iostream>
#include <unordered_map>
#include <string>int main() {std::unordered_multimap<int, std::string> idNames;idNames.insert({ 1, "Alice" });idNames.insert({ 2, "Bob" });idNames.insert({ 1, "Charlie" });idNames.insert({ 3, "David" });auto range = idNames.equal_range(1);for (auto it = range.first; it != range.second; ++it) {std::cout << "ID: " << it->first << ", Name: " << it->second << std::endl;}return 0;
}

STL容器迭代器一览

迭代器性能一览

 copy()

  1. OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
  2. copy()函数将覆盖目标容器中已有的数据,同时目标容器必须足够大,以便能够容纳被复制的元素。
// copy algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::copy
#include <vector>       // std::vectorint main () {int myints[]={10,20,30,40,50,60,70};std::vector<int> myvector (7);std::copy ( myints, myints+7, myvector.begin() );std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin(); it!=myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}

ostream_iterator

  1. template< class T, class charT = char, class traits = std::char_traits<charT> >
  2. ostream_iterator(std::ostream& os, const charT* delim);:构造一个 ostream_iterator,将元素输出到指定的输出流 os,每个元素后跟着分隔符 delim
  3. std::ostream_iterator 是一个输出迭代器,只支持 ++(前置和后置)、* 和 = 操作符。
  4. *out_iter++ = 15;   //works like cout << 15 << " ";
  5. copy(istream_iterator<int,char>(cin),istream_iterator<int,char>(),dice.begin());
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用 std::ostream_iterator 将 vector 元素输出到 std::cout,元素间以空格分隔std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));std::cout << std::endl;return 0;
}

reverse_iterator

        rbegin和rend

  1. 前者返回一个指向超尾的反向迭代器
  2. 后者返回一个指向第一个元素的反向迭代器。
  3. *rbegin = *(end-1)
  4. *rend = *(begin -1)

insert_iterator系列

        insert_iterator、back_insert_iterator和front_insert_iterator,这三个为插入迭代器。

  1. back_insert_iterator将元素插入到容器尾部
  2. front_insert_iterator将元素插入到容器的前端,不能用于vector这样头插效率极低的容器
  3. insert_iterator将元素插入到insert_iterator构造函数的参数指定的位置前面
  4. 这三个插入迭代器都是输出容器概念的模型
  5. back_insert_iterator<vector<int>>back_iter(dice);
  6. front_insert_iterator<vector<int>>front_iter(dice);
  7. insert_iterator<vector<int>>insert_iter(dice,dice.begin());
  8. 必须声明容器类型的原因是,迭代器必须使用合适的容器方法。back_insert_iterator的构造函数将假设传递给它的类型有一个push_back()方法。copy()是一个独立的函数,没有重新调整容器大小的权限。但前面的声明让back_iter能够使用方法vector<int>::push_back(),该方法有这样的权限。

for_each

  1. Function for_each (InputIterator first, InputIterator last, Function fn)
  2. for_each 本身不会修改数组元素,但它会对范围内的每个元素调用你提供的函数或函数对象,如果这个函数或函数对象对元素进行了修改操作,那么数组元素就会被修改。
#include <iostream>
#include <algorithm>
#include <array>// 定义一个函数,将传入的整数加倍
void doubleValue(int& num) {num *= 2;
}int main() {std::array<int, 5> arr = {1, 2, 3, 4, 5};// 使用 for_each 对数组每个元素应用 doubleValue 函数std::for_each(arr.begin(), arr.end(), doubleValue);// 输出修改后的数组for (int num : arr) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

set_union

  1. set_union 是 C++ 标准库 <algorithm> 头文件中的一个算法,用于构造两个有序范围的并集。这里的 “有序” 至关重要,意味着输入的两个范围必须是已经排好序的(通常是升序),否则结果将是未定义的。

        示例 1:使用默认比较(<)

#include <iostream>
#include <algorithm>
#include <vector>int main() {std::vector<int> v1 = {1, 2, 3, 5, 7};std::vector<int> v2 = {2, 4, 6, 7};std::vector<int> result(v1.size() + v2.size());auto it = std::set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), result.begin());result.resize(std::distance(result.begin(), it));std::cout << "Union of the two vectors: ";for (int num : result) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

        示例 2:使用自定义比较函数

#include <iostream>
#include <algorithm>
#include <vector>// 自定义比较函数,用于降序比较
bool greaterThan(int a, int b) {return a > b;
}int main() {std::vector<int> v1 = {7, 5, 3, 2, 1};std::vector<int> v2 = {7, 6, 4, 2};std::vector<int> result(v1.size() + v2.size());auto it = std::set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), result.begin(), greaterThan);result.resize(std::distance(result.begin(), it));std::cout << "Union of the two vectors in descending order: ";for (int num : result) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

        示例3:复习front_insert_iterator

#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>int main() {std::vector<int> v1 = { 1, 2, 3, 5, 7 };std::vector<int> v2 = { 2, 4, 6, 7 };std::vector<int> result;auto it = std::set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), std::insert_iterator<std::vector<int>>(result, result.begin()));//result.resize(std::distance(result.begin(), it));std::cout << "Union of the two vectors: ";for (int num : result) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

remove_if

  1. ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p);
  2. 从指定范围内移除满足特定条件的元素。需要注意的是,它并不是真正从容器中删除元素,而是将不满足条件的元素 “向前移动”,覆盖满足条件的元素
  3. 返回一个指向新的逻辑结束位置的迭代器
  4. 要真正从容器中删除元素,通常需要结合容器的 erase 成员函数

        示例 1:

#include <iostream>
#include <algorithm>
#include <vector>int main() {std::vector<int> numbers = { 1, 2, 3, 4, 5, 6 };auto newEnd = std::remove_if(numbers.begin(), numbers.end(), [](int num) {return num % 2 == 0;});numbers.erase(newEnd, numbers.end());std::cout << "Numbers after removing even numbers: ";for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

        示例 2:

#include <iostream>
#include <algorithm>
#include <list>// 函数对象
struct GreaterThanTen {bool operator()(int num) const {return num > 10;}
};int main() {std::list<int> lst = {5, 15, 8, 20, 3};lst.erase(std::remove_if(lst.begin(), lst.end(), GreaterThanTen()), lst.end());std::cout << "List after removing numbers greater than 10: ";for (int num : lst) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

transform

  1. OutputIt transform(InputIt first, InputIt last, OutputIt d_first, UnaryOperation unary_op);
  2. OutputIt transform(InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt d_first, BinaryOperation binary_op);

        示例 1:单输入范围

#include <iostream>
#include <algorithm>
#include <vector>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};std::vector<int> squaredNumbers(numbers.size());std::transform(numbers.begin(), numbers.end(), squaredNumbers.begin(), [](int num) {return num * num;});std::cout << "Squared numbers: ";for (int num : squaredNumbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

        示例 2:双输入范围

#include <iostream>
#include <algorithm>
#include <vector>// 函数对象
struct AddNumbers {int operator()(int a, int b) const {return a + b;}
};int main() {std::vector<int> numbers1 = {1, 2, 3};std::vector<int> numbers2 = {4, 5, 6};std::vector<int> sumNumbers(numbers1.size());std::transform(numbers1.begin(), numbers1.end(), numbers2.begin(), sumNumbers.begin(), AddNumbers());std::cout << "Sum of corresponding numbers: ";for (int num : sumNumbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

list.remove

  1. void remove (const value_type& val)
  2. void remove_if (Predicate pred)
  3. 调用该方法后,链表中所有值为val的元素都将被删除,同时链表的长度将被自动调整。

string.find

  1. size_t find (const string& str, size_t pos = 0) const;
  2. size_t find (const char* s, size_t pos = 0) const;
  3. 如果未找到,返回 std::string::npos

string.substr

  1. string substr (size_t pos = 0, size_t len = npos) const;

算法组

  1. 非修改式序列操作
  2. 修改式序列操作
  3. 排序和相关操作
  4. 通用数字运算
  • 非修改式序列操作对区间中的每个元素进行操作。这些操作不修改容器的内容。例如,find()和for_each()就属于这一类。
  • 修改式序列操作也对区间中的每个元素进行操作。然而,顾名思义,它们可以修改容器的内容。可以修改值,也可以修改值的排列顺序。transform()、random_shuffle()和copy()属于这一类。
  • 排序和相关操作包括多个排序函数(包括sort())和其他各种函数,包括集合操作。
  • 数字操作包括将区间的内容累积、计算两个容器的内部乘积、计算小计、计算相邻对象差的函数。通常,这些都是数组的操作特性,因此vector是最有可能使用这些操作的容器。
  1. sort()是就地算法:结果被存放在原始数据的位置上
  2. copy()函数将结果发送到另一个位置,所以它是复制算法
  3. transform()函数可以以这两种方式完成工作
  • 有些算法有两个版本:就地版本和复制版本。
  • STL的约定是,复制版本的名称将以copy结尾。
  • template<class ForwardIterator,class T>
    void replace(ForwardIterator first,ForwardIterator last,const T&old_value,const T&new_value);
  • template<class InputIterator,class OutputIterator,class T>OutputIterator replace_copy(InputIterator first,InputIterator last,OutputIterator result,const T&old_value,const T&new_value)
  • 对于复制算法,统一的约定是:返回一个迭代器,该迭代器指向复制的最后一个值后面的一个位置。
  1. 有些函数有这样的版本,即根据将函数应用于容器元素得到的结果来执行操作。
  2. 这些版本的名称通常以_if结尾。
  3. 例如,如果将函数用于旧值时,返回的值为true,则replace_if()将把旧值替换为新的值。
  4. template<class ForwardIterator,class Predicate class T>void replace_if(ForwardIterator first,ForwardIterator last,Predicate pred,const T&new_value);

tolower

  • 将给定的字符转换为小写形式。如果字符本身不是大写字母,函数将返回原字符。
  • int tolower( int ch );
#include <iostream>
#include <cctype>int main() {char upperCase = 'A';char lowerCase = static_cast<char>(std::tolower(upperCase));std::cout << "The lowercase of " << upperCase << " is " << lowerCase << std::endl;char nonLetter = '1';char result = static_cast<char>(std::tolower(nonLetter));std::cout << "The result of converting " << nonLetter << " is " << result << std::endl;return 0;
}

toupper

  • 将给定的字符转换为大写形式。如果字符本身不是小写字母,函数将返回原字符。
  • int toupper( int ch );
#include <iostream>
#include <cctype>int main() {char lowerCase = 'b';char upperCase = static_cast<char>(std::toupper(lowerCase));std::cout << "The uppercase of " << lowerCase << " is " << upperCase << std::endl;char nonLetter = '@';char result = static_cast<char>(std::toupper(nonLetter));std::cout << "The result of converting " << nonLetter << " is " << result << std::endl;return 0;
}

next_permutation

  1. next_permutation()算法将区间内容转换为下一种排列方式。
  2. 对于字符串,排列按照字母递增的顺序进行。
  3. 如果成功,该算法返回true;如果区间已经处于最后的序列中,则该算法返回false。
  4. 要得到区间内容的所有排列组合,应从最初的顺序开始,为此程序使用了STL算法sort()。
  5. 注意,算法next_permutation()自动提供唯一的排列组合
// strgstl.cpp -- applying the STL to a string
#include <iostream>
#include <string>
#include <algorithm>int main()
{using namespace std;string letters;cout << "Enter the letter grouping (quit to quit): ";while (cin >> letters && letters != "quit"){cout << "Permutations of " << letters << endl;sort(letters.begin(), letters.end());cout << letters << endl;while (next_permutation(letters.begin(), letters.end()))cout << letters << endl;cout << "Enter next sequence (quit to quit): ";}cout << "Done.\n";// cin.get();// cin.get();return 0;
}
Enter the letter grouping (quit to quit): Permutations of awl
alw
awl
law
lwa
wal
wla
Enter next sequence (quit to quit): Permutations of all
all
lal
lla
Enter next sequence (quit to quit): Done.

unique

  1. 只能用于移除相邻的重复元素
  2. template <class ForwardIterator>
      ForwardIterator unique (ForwardIterator first, ForwardIterator last);
  3. template <class ForwardIterator, class BinaryPredicate>
      ForwardIterator unique (ForwardIterator first, ForwardIterator last,
                              BinaryPredicate pred);

count_if

  • template <class InputIterator, class UnaryPredicate>typename iterator_traits<InputIterator>::difference_typecount_if (InputIterator first, InputIterator last, UnaryPredicate pred);

bitset:用于将整数转化为二进制

#include <iostream>
#include <bitset>int main() {int num = 13;std::cout << "Decimal: " << num << std::endl;std::cout << "Binary: " << std::bitset<8 * sizeof(int)>(num) << std::endl;return 0;
}

后续

        正在努力撰写ing

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86089.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86089.shtml
英文地址,请注明出处:http://en.pswp.cn/web/86089.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux 设备树DTS】

Linux 设备树DTS 一、设备树概述&#xff1a;为什么它是 Linux 驱动开发的关键&#xff1f;二、设备树语法详解&#xff1a;从基础到高级2.1 基本结构&#xff1a;节点与属性2.2 数据类型与表示方式2.3 引用与别名2.4 address-cells和size-cells属性详解2.5 包含与覆盖2.6 未定…

【技巧】使用frpc安全地内网穿透ssh访问内网机器

【技巧】使用frpc安全地内网穿透ssh访问内网机器 0. 为什么需要部署 office的机器可以单向访问互联网&#xff0c;互联网无法直接访问到这台机器。有时候需要从家里通过ssh远程访问和配置。 在云服务器上部署frpc把转发ssh给需要访问的机器。 1. 互联网云服务器&#xff08;…

【Faster-Whisper】离线识别本地视频并生成字幕

【Faster-Whisper】离线识别本地视频并生成字幕 1 前言2 工具说明2.1 ffmpeg 媒体转换器2.1.1 理论简介文档 2.1.2 安装win安装python安装 2.1.3 查看查看音视频文件格式、编码 2.1.4 视频处理视频格式转换设置 视频码率裁剪视频 2.1.5 音频处理视频提取音频音频格式转换gpu加速…

开源CMS vs 闭源CMS:二次开发究竟有何不同?

在网站建设项目中&#xff0c;内容管理系统&#xff08;CMS&#xff09; 是核心基础设施。而“二次开发”则是让CMS真正适配业务需求的关键环节&#xff0c;譬如调整页面样式&#xff0c;或者新增会员体系等等。但很多人没意识到&#xff1a;选择开源CMS还是闭源CMS&#xff0c…

npm 更新包名,本地导入

package.json 更新包根目录名字&#xff0c;同时改 name 和 dependencies相关的依赖也需本地导入&#xff0c;否则无法生效 之后将改包放在你所需的项目位置&#xff0c;通过以下命令导入node_modules生效 pnpm install file:../table-ui/m-table -w防止包数据更新或丢弃&…

若依框架二次开发——若依前后端分离版集成 UReport2 报表工具

文章目录 一、UReport2 简介二、解决方案1、后端配置1.1 引入 UReport2 依赖1.2 启动类配置1.3配置文件1.4 修改安全配置2、前端配置2.1 配置 Vue.js 代理2.2创建设计器页面2.3 新增菜单运行结果一、UReport2 简介 UReport2 是一款开源的 Java 报表工具,广泛应用于各类企业管…

Ntfs!_LFCB结构如何构建出来的--从Ntfs!NtfsMountVolume到Ntfs!LfsAllocateLfcb

Ntfs!LfsRestartLogFile函数分析之调用Ntfs!LfsAllocateLfcb函数初始化Lfcb->LbcbWorkque 第一部分&#xff1a; F:\srv03rtm>grep "NtfsStartLogFile" -rn F:\srv03rtm\base\fs\ntfs |grep -v "inary" F:\srv03rtm\base\fs\ntfs/fsctrl.c:1890: …

Domain层到底是什么

层级主要职责是否依赖 iOS / UIKit&#xff1f;Presentation (UI)视图、控制器、ViewModel&#xff0c;将用户操作转成「意图」&#xff0c;把结果渲染到屏幕是Domain业务规则 与 用例 (Use Case)&#xff0c;维护系统在概念上的真实世界模型否&#xff08;纯 Swift&#xff0c…

Rust 服务端项目分层结构

DDD src/ ├── main.rs # 程序入口&#xff0c;负责启动和依赖注入 ├── lib.rs # 公共库入口&#xff0c;便于单元测试和复用 ├── config.rs # 配置管理&#xff08;如数据库、端口、环境变量等&#xff09; ├── entities/ …

山东大学《Web数据管理》期末复习宝典【万字解析!】

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f3c0;山东大学期末速通专用_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1…

解决“在EFI系统上,Windows只能安装到GPT磁盘“错误

环境&#xff1a;AMI BIOS&#xff08;2012 American Megatrends,Inc.&#xff09;&#xff0c;清华同方笔记本&#xff0c;windows10安装U盘 背景&#xff1a;使用安装U盘安装系统时&#xff0c;在选择磁盘下一步&#xff0c;出现了“无法在驱动器0的分区1上安装windows(w)。…

NetworkTermination-原始固件-分区备份

在对设备进行固件分区备份之前&#xff0c;我们需要通过设备的 debug 接口进行连接。设备的 debug 接口位于左下角&#xff0c;连接时需设置波特率为 115200。 ssh连接 设备默认的 SSH 服务配置较为严格&#xff0c;端口号为 33998&#xff0c;且不允许通过密码直接登录。我们可…

Network Manager客户端制作小结

关联资料 Unity 入门到精通&#xff08;沈军&#xff09; c语言中的局部变量和全局变量_c语言全局变量-CSDN博客 关键词 本地玩家信息&#xff1a;LocalClientId 网络状态及网络序列化 网络游戏服务器和客户端 ClientRpc与ServerRpc 变量作用域与作用周期 Network Manager —…

Python 开发环境全栈隔离架构:从 Anaconda 到 PyCharm 的四级防护体系

【深度探索】Windows 下 Python 多版本虚拟环境管理与隔离实战&#xff1a;支持 Anaconda、Poetry、Pipenv、venv、uv、Hatch、PyCharm、VS Code 全工具链方案-CSDN博客 【零基础】Python 多版本虚拟环境管理与隔离实战——支持 Anaconda、Poetry、Pipenv、venv、uv、Hatch、Py…

Redis集群性能优化实战指南

Redis集群性能优化实战指南 一、技术背景与应用场景 随着互联网服务规模不断扩大&#xff0c;缓存层承载了海量的读写请求。Redis因其高性能和丰富的数据结构被广泛用于缓存、排行榜、会话存储等场景。单节点Redis在并发、内存和持久化方面会遇到瓶颈&#xff0c;Redis集群&a…

使用 Telegraf 向 TDengine 写入数据

Telegraf 是一款十分流行的指标采集开源软件。在数据采集和平台监控系统中&#xff0c;Telegraf 可以采集多种组件的运行信息&#xff0c;而不需要自己手写脚本定时采集&#xff0c;降低数据获取的难度。 只需要将 Telegraf 的输出配置增加指向 taosAdapter 对应的 url 并修改…

华为云 Flexus+DeepSeek 征文|华为云Dify 平台 CCE 高可用集群部署与大模型高质量知识库构建指南

华为云 FlexusDeepSeek 征文&#xff5c;华为云Dify 平台 CCE 高可用集群部署与大模型高质量知识库构建指南 文章目录 华为云 FlexusDeepSeek 征文&#xff5c;华为云Dify 平台 CCE 高可用集群部署与大模型高质量知识库构建指南前言1、ModelArts Studio大模型开通2、Dify平台CC…

测试校招/应届刷题知识路线

需要重点关注计算机基础知识和测试相关技能 对于即将参加校招或应届的同学,测试岗位需要重点关注计算机基础知识和测试相关技能。 掌握操作系统、计算机网络、数据库等计算机基础,同时熟悉测试基础理论、测试方法、自动化测试工具 (如 Selenium、JMeter)和编程语言(如 Py…

华为云Flexus+DeepSeek征文 | 基于华为云的 Dify-LLM 企业级 AI 开发平台部署指南

前言 在人工智能技术迅猛发展的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为推动企业智能化转型的核心引擎。然而&#xff0c;如何高效、安全地将 LLM 能力整合到实际业务场景中&#xff0c;仍然是许多开发者面临的挑战。Dify 作为一款开源的 LLM 应用开发平…

Dify×奇墨科技:开源+本土化,破解企业AI落地难题

在人工智能技术迅猛发展的今天&#xff0c;企业亟需高效、安全的AI应用开发工具。开源LLMOps平台Dify.AI凭借其灵活性与开放性&#xff0c;已成为开发者构建AI应用的首选之一。而它在中国市场的规模化落地&#xff0c;离不开本土合作伙伴的强力支撑——奇墨科技作为Dify中国大陆…