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

【STL一】STL组件(容器、迭代器、算法)

【STL一】STL组件(容器、迭代器、算法)

  • 一、STL
  • 二、STL组件(component)
    • 1、stl六大组件
    • 2、C++ STL的13个头文件
    • 3、stl所有头文件
  • 三、容器(container)
    • 1、序列容器(Sequence container)——顺序容器
    • 2、关联容器(Associative container)——排序容器
    • 3、无序容器(unordered (associative) container)——哈希容器
    • 4、其他容器
    • 5、容器实现
  • 四、迭代器(iterator)
    • 1、迭代器分类
    • 2、迭代器定义
    • 3、begin、end
  • 五、算法(algorithm)
  • 六、demo
    • 1、遍历 vector 容器。
    • 2、遍历 list 容器
    • 3、算法(反转)

简介:
STL 是“Standard Template Library”的缩写,中文译为“标准模板库”。STL 是 C++ 标准库的一部分,不用单独安装。C++ 对模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。例如,vector 的底层为顺序表(数组),list 的底层为双向链表,deque 的底层为循环队列,set 的底层为红黑树,hash_set 的底层为哈希表。

一、STL

  • STL,英文全称 standard template library,中文可译为标准模板库(或者泛型(generic)库),其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能

从程序员的角度来看,STL是由一些可适应不同需求的集合类(collection class)和一些能够在这些数据集合尚运作的算法构成。

  • STL内的所有组件都是由template(模板)构成,所以这些元素可以是任何类型。

  • STL赋予了c++新的抽象层次。

抛开dynamic array(动态数组)、linked list(链表)、binary tree(二叉树)、hash table(散列表)、之类的东西吧,再也不用担心各种search(查找)算法了。你只需要恰当的使用集合类,然后调用其成员函数和算法来处理数据,就万事大吉。

  • c++标准库中的所有标识符都被定义于一个名为std的namespace内;

二、STL组件(component)

1、stl六大组件

STL组件包括是由容器、算法、迭代器、函数对象、适配器、内存分配器;(这些组件中,最关键的是容器、迭代器和算法)

stl组件也被网上成为stl六大组件。当然,stl组件也有叫stl组成的,大家清楚即可。

STL组件含义
容器一些封装数据结构的模板类,例如 vector 向量容器、list 列表容器等。
算法STL 提供了非常多(大约 100 个)的数据结构算法,它们都被设计成一个个的模板函数,这些算法在 std 命名空间中定义,其中大部分算法都包含在头文件 中,少部分位于头文件 中。
迭代器在 C++ STL 中,对容器中数据的读和写,是通过迭代器完成的,扮演着容器和算法之间的胶合剂。
函数对象如果一个类将 () 运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象(又称仿函数)。
适配器可以使一个类的接口(模板的参数)适配成用户指定的形式,从而让原本不能在一起工作的两个类工作在一起。值得一提的是,容器、迭代器和函数都有适配器。
内存分配器为容器类模板提供自定义的内存申请和释放功能,由于往往只有高级用户才有改变内存分配策略的需求,因此内存分配器对于一般用户来说,并不常用。

2、C++ STL的13个头文件

在 C++ 标准中,它们被重新组织为 13 个头文件,如表所示。

stl组件头文件
容器<vector> <deque> <list> <queue> <stack> <set> <map>
算法<algorithm> <numeric>
迭代器<iterator>
函数对象<functional>
内存分配器<memory>
通用工具<utility>

C++ STL 标准库头文件 中文文档
C++ STL基本组成(6大组件+13个头文件)

3、stl所有头文件

C++ STL C++ 标准库头文件 中文文档

在这里插入图片描述

三、容器(container)

  • 容器:是用来管理某类对象的集合。

每一种容器都有其优点和缺点,所有,为了应付不同的需求,stl准备了不同的容器类型。

  • 容器可分为三大类:序列容器(Sequence container)、关联容器(Associative container)、无序容器(unordered (associative) container)

在这里插入图片描述

1、序列容器(Sequence container)——顺序容器

  • 是一种有序(ordered)集合;
  • 其内每个元素均有明确的位置——取决于插入时机和地点,与元素值无关。
  • 之所以被称为序列容器,是因为元素在容器中的位置同元素的值无关,即容器不是排序的。将元素插入容器时,指定在什么位置,元素就会位于什么位置。

如果你以追加方式对一个集合置入6个元素,它们的排列顺序将和置于次序一致。

  • STL提供了5个定义好的序列容器:array、vector、deque、list、forward_list

2、关联容器(Associative container)——排序容器

  • 关联容器也被成为——排序容器;
  • 是一种已排序(sorted)集合;
  • 元素位置取决于其value(或key——如果元素是个key/value pair)和给定的某个排序准则。

如果你将6个元素置于这样的集合中,他们的值将决定他们的次序,和插入次序无关。

排序容器中的元素默认是由小到大排序好的,即便是插入元素,元素也会插入到适当位置。所以关联容器在查找时具有非常好的性能。

  • STL提供了四个关联容器:set和multiset、map和multimap;

3、无序容器(unordered (associative) container)——哈希容器

  • 五序容器也有被翻译为——哈希容器
  • 这是一种无序集合(unordered collection);
  • 其内每个元素的位置无关紧要,唯一重要的是某特定元素释放至于此集合内;

元素值或其安插顺序,都不影响;

C++ 11 新加入 4 种关联式容器,分别是 unordered_set 哈希集合、unordered_multiset 哈希多重集合、unordered_map 哈希映射以及 unordered_multimap 哈希多重映射。和排序容器不同,哈希容器中的元素是未排序的,元素的位置由哈希函数确定。

4、其他容器

  • 可以把string当作一种stl容器。(这里的string指的是c++ string class对象(basic_string<>、string、wstring)

5、容器实现

  • Sequence 通常被实现为array或linked list。
  • Associative 通常实现为binary tree。
  • unordered 通常实现为hash table。

四、迭代器(iterator)

无论是序列容器还是关联容器,它们本质上都是用来存储大量数据的。诸如数据的排序、查找、求和、插入等需要对数据进行遍历的操作方法应该是类似的。而实现此操作,多数情况会选用“迭代器(iterator)”来实现。

它除了要具有对容器进行遍历读写数据的能力之外,还要能对外隐藏容器的内部差异,从而以统一的界面向算法传送数据。

  • 迭代器是一个“可遍历STL容器全部或部分元素”的对象.

1、迭代器分类

STL 标准库为每一种标准容器定义了一种迭代器类型,这意味着,不同容器的迭代器也不同,其功能强弱也有所不同。

常用的迭代器按功能强弱分为输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器 5 种。本节主要介绍后面的这 3 种迭代器。

    1. 前向迭代器(forward iterator)
      假设 p 是一个前向迭代器,则 p 支持 ++p,p++,*p 操作,还可以被复制或赋值,可以用 == 和 != 运算符进行比较。此外,两个正向迭代器可以互相赋值。
    1. 双向迭代器(bidirectional iterator)
      双向迭代器具有正向迭代器的全部功能,除此之外,假设 p 是一个双向迭代器,则还可以进行 --p 或者 p-- 操作(即一次向后移动一个位置)。
    1. 随机访问迭代器(random access iterator)
      随机访问迭代器具有双向迭代器的全部功能。除此之外,假设 p 是一个随机访问迭代器,i 是一个整型变量或常量,则 p 还支持以下操作:
      p+=i:使得 p 往后移动 i 个元素。
      p-=i:使得 p 往前移动 i 个元素。
      p+i:返回 p 后面第 i 个元素的迭代器。
      p-i:返回 p 前面第 i 个元素的迭代器。
      p[i]:返回 p 后面第 i 个元素的引用。
容器对应的迭代器类型
array随机访问迭代器
vector随机访问迭代器
deque随机访问迭代器
list双向迭代器
set / multiset双向迭代器
map / multimap双向迭代器
forward_list前向迭代器
unordered_map / unordered_multimap前向迭代器
unordered_set / unordered_multiset前向迭代器
stack不支持迭代器
queue不支持迭代器

2、迭代器定义

尽管不同容器对应着不同类别的迭代器,但这些迭代器有着较为统一的定义方式,具体分为 4 种,

迭代器定义方式具体格式
正向迭代器容器类名::iterator 迭代器名;
常量正向迭代器容器类名::const_iterator 迭代器名;
反向迭代器容器类名::reverse_iterator 迭代器名;
常量反向迭代器容器类名::const_reverse_iterator 迭代器名;

迭代器是什么,C++ STL迭代器(iterator)用法详解

3、begin、end

所有容器都提供一些最级别的成员函数,使我们得以取得迭代器并以之便利所有元素。
这些函数中最重要的是:

  • begin():返回一个迭代器,指向容器的起点,也就是第一个元素(如果有的话)的位置。
  • end()返回一个迭代器,指向容器终点。终点位于最末元素的下一个位置。
    在这里插入图片描述

五、算法(algorithm)

STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。

只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。

STL中算法大致分为四类:

  • 非可变序列算法:指不直接修改其所操作的容器内容的算法。
  • 可变序列算法:指可以修改它们所操作的容器内容的算法。
  • 排序算法:对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。
  • 数值算法:对容器内容进行数值计算。

C++中STL用法超详细总结(收藏级)

以下对所有算法进行细致分类并标明功能:<一>查找算法(13个):判断容器中是否包含某个值adjacent_find: 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的 ForwardIterator。否则返回last。重载版本使用输入的二元操作符代替相等的判断。binary_search: 在有序序列中查找value,找到返回true。重载的版本实用指定的比较函数对象或函数指针来判断相等。count: 利用等于操作符,把标志范围内的元素与输入值比较,返回相等元素个数。count_if: 利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数。equal_range: 功能类似equal,返回一对iterator,第一个表示lower_bound,第二个表示upper_bound。find: 利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的 一个InputIterator。find_end: 在指定范围内查找"由输入的另外一对iterator标志的第二个序列"的最后一次出现。找到则返回最后一对的第一 个ForwardIterator,否则返回输入的"另外一对"的第一个ForwardIterator。重载版本使用用户输入的操作符代 替等于操作。find_first_of: 在指定范围内查找"由输入的另外一对iterator标志的第二个序列"中任意一个元素的第一次出现。重载版本中使 用了用户自定义操作符。find_if: 使用输入的函数代替等于操作符执行find。lower_bound: 返回一个ForwardIterator,指向在有序序列范围内的可以插入指定值而不破坏容器顺序的第一个位置。重载函 数使用自定义比较操作。upper_bound: 返回一个ForwardIterator,指向在有序序列范围内插入value而不破坏容器顺序的最后一个位置,该位置标志 一个大于value的值。重载函数使用自定义比较操作。search: 给出两个范围,返回一个ForwardIterator,查找成功指向第一个范围内第一次出现子序列(第二个范围)的位 置,查找失败指向last1。重载版本使用自定义的比较操作。search_n: 在指定范围内查找val出现n次的子序列。重载版本使用自定义的比较操作。<二>排序和通用算法(14个):提供元素排序策略inplace_merge: 合并两个有序序列,结果序列覆盖两端范围。重载版本使用输入的操作进行排序。merge: 合并两个有序序列,存放到另一个序列。重载版本使用自定义的比较。nth_element: 将范围内的序列重新排序,使所有小于第n个元素的元素都出现在它前面,而大于它的都出现在后面。重 载版本使用自定义的比较操作。partial_sort: 对序列做部分排序,被排序元素个数正好可以被放到范围内。重载版本使用自定义的比较操作。partial_sort_copy: 与partial_sort类似,不过将经过排序的序列复制到另一个容器。partition: 对指定范围内元素重新排序,使用输入的函数,把结果为true的元素放在结果为false的元素之前。random_shuffle: 对指定范围内的元素随机调整次序。重载版本输入一个随机数产生操作。reverse: 将指定范围内元素重新反序排序。reverse_copy: 与reverse类似,不过将结果写入另一个容器。rotate: 将指定范围内元素移到容器末尾,由middle指向的元素成为容器第一个元素。rotate_copy: 与rotate类似,不过将结果写入另一个容器。sort: 以升序重新排列指定范围内的元素。重载版本使用自定义的比较操作。stable_sort: 与sort类似,不过保留相等元素之间的顺序关系。stable_partition: 与partition类似,不过不保证保留容器中的相对顺序。<三>删除和替换算法(15个)copy: 复制序列copy_backward: 与copy相同,不过元素是以相反顺序被拷贝。iter_swap: 交换两个ForwardIterator的值。remove: 删除指定范围内所有等于指定元素的元素。注意,该函数不是真正删除函数。内置函数不适合使用remove和 remove_if函数。remove_copy: 将所有不匹配元素复制到一个制定容器,返回OutputIterator指向被拷贝的末元素的下一个位置。remove_if: 删除指定范围内输入操作结果为true的所有元素。remove_copy_if: 将所有不匹配元素拷贝到一个指定容器。replace: 将指定范围内所有等于vold的元素都用vnew代替。replace_copy: 与replace类似,不过将结果写入另一个容器。replace_if: 将指定范围内所有操作结果为true的元素用新值代替。replace_copy_if: 与replace_if,不过将结果写入另一个容器。swap: 交换存储在两个对象中的值。swap_range: 将指定范围内的元素与另一个序列元素值进行交换。unique: 清除序列中重复元素,和remove类似,它也不能真正删除元素。重载版本使用自定义比较操作。unique_copy: 与unique类似,不过把结果输出到另一个容器。<四>排列组合算法(2个):提供计算给定集合按一定顺序的所有可能排列组合next_permutation: 取出当前范围内的排列,并重新排序为下一个排列。重载版本使用自定义的比较操作。prev_permutation: 取出指定范围内的序列并将它重新排序为上一个序列。如果不存在上一个序列则返回false。重载版本使用 自定义的比较操作。<五>算术算法(4个)accumulate: iterator对标识的序列段元素之和,加到一个由val指定的初始值上。重载版本不再做加法,而是传进来的 二元操作符被应用到元素上。partial_sum: 创建一个新序列,其中每个元素值代表指定范围内该位置前所有元素之和。重载版本使用自定义操作代 替加法。inner_product: 对两个序列做内积(对应元素相乘,再求和)并将内积加到一个输入的初始值上。重载版本使用用户定义 的操作。adjacent_difference: 创建一个新序列,新序列中每个新值代表当前元素与上一个元素的差。重载版本用指定二元操作计算相 邻元素的差。<六>生成和异变算法(6个)fill: 将输入值赋给标志范围内的所有元素。fill_n: 将输入值赋给first到first+n范围内的所有元素。for_each: 用指定函数依次对指定范围内所有元素进行迭代访问,返回所指定的函数类型。该函数不得修改序列中的元素。generate: 连续调用输入的函数来填充指定的范围。generate_n: 与generate函数类似,填充从指定iterator开始的n个元素。transform: 将输入的操作作用与指定范围内的每个元素,并产生一个新的序列。重载版本将操作作用在一对元素上,另外一 个元素来自输入的另外一个序列。结果输出到指定容器。<七>关系算法(8个)equal: 如果两个序列在标志范围内元素都相等,返回true。重载版本使用输入的操作符代替默认的等于操 作符。includes: 判断第一个指定范围内的所有元素是否都被第二个范围包含,使用底层元素的<操作符,成功返回 true。重载版本使用用户输入的函数。lexicographical_compare: 比较两个序列。重载版本使用用户自定义比较操作。max: 返回两个元素中较大一个。重载版本使用自定义比较操作。max_element: 返回一个ForwardIterator,指出序列中最大的元素。重载版本使用自定义比较操作。min: 返回两个元素中较小一个。重载版本使用自定义比较操作。min_element: 返回一个ForwardIterator,指出序列中最小的元素。重载版本使用自定义比较操作。mismatch: 并行比较两个序列,指出第一个不匹配的位置,返回一对iterator,标志第一个不匹配元素位置。 如果都匹配,返回每个容器的last。重载版本使用自定义的比较操作。<八>集合算法(4个)set_union: 构造一个有序序列,包含两个序列中所有的不重复元素。重载版本使用自定义的比较操作。set_intersection: 构造一个有序序列,其中元素在两个序列中都存在。重载版本使用自定义的比较操作。set_difference: 构造一个有序序列,该序列仅保留第一个序列中存在的而第二个中不存在的元素。重载版本使用 自定义的比较操作。set_symmetric_difference: 构造一个有序序列,该序列取两个序列的对称差集(并集-交集)。<九>堆算法(4个)make_heap: 把指定范围内的元素生成一个堆。重载版本使用自定义比较操作。pop_heap: 并不真正把最大元素从堆中弹出,而是重新排序堆。它把first和last-1交换,然后重新生成一个堆。可使用容器的 back来访问被"弹出"的元素或者使用pop_back进行真正的删除。重载版本使用自定义的比较操作。push_heap: 假设first到last-1是一个有效堆,要被加入到堆的元素存放在位置last-1,重新生成堆。在指向该函数前,必须先把 元素插入容器后。重载版本使用指定的比较操作。sort_heap: 对指定范围内的序列重新排序,它假设该序列是个有序堆。重载版本使用自定义比较操作。

六、demo

1、遍历 vector 容器。

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> v{ 1,2,3,4,5,6,7,8,9,10 }; //v被初始化成有10个元素cout << "第一种遍历方法:" << endl;//size返回元素个数for (int i = 0; i < v.size(); ++i)cout << v[i] << " "; //像普通数组一样使用vector容器//创建一个正向迭代器,当然,vector也支持其他 3 种定义迭代器的方式cout << endl << "第二种遍历方法:" << endl;vector<int>::iterator i;//用 != 比较两个迭代器for (i = v.begin(); i != v.end(); ++i)cout << *i << " ";cout << endl << "第三种遍历方法:" << endl;for (i = v.begin(); i < v.end(); ++i) //用 < 比较两个迭代器cout << *i << " ";cout << endl << "第四种遍历方法:" << endl;i = v.begin();while (i < v.end()) { //间隔一个输出cout << *i << " ";i += 2; // 随机访问迭代器支持 "+= 整数"  的操作}
}

输出

第一种遍历方法:
1 2 3 4 5 6 7 8 9 10
第二种遍历方法:
1 2 3 4 5 6 7 8 9 10
第三种遍历方法:
1 2 3 4 5 6 7 8 9 10
第四种遍历方法:
1 3 5 7 9

2、遍历 list 容器

#include <iostream>
#include <list>
using namespace std;
int main()
{list<int> v = {1,2,3,4,5};//创建一个常量正向迭代器,同样,list也支持其他三种定义迭代器的方式。list<int>::const_iterator i;// 则以下代码是合法的:for (i = v.begin(); i != v.end(); ++i)cout << *i<<" ";
}

输出

1 2 3 4 5

  • 以下代码则不合法,因为双向迭代器不支持用“<”进行比较:
for(i = v.begin(); i < v.end(); ++i)cout << *i;
  • 以下代码也不合法,因为双向迭代器不支持用下标随机访问元素:
for(int i=0; i<v.size(); ++i)cout << v[i];

3、算法(反转)

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> v{ 1,2,3,4,5,6,7,8,9,10 }; //v被初始化成有10个元素cout << "遍历(正序):" << endl;//size返回元素个数for (int i = 0; i < v.size(); ++i)cout << v[i] << " "; //像普通数组一样使用vector容器//反转std::reverse(begin(v), end(v));cout << endl << "遍历(反转):" << endl;vector<int>::iterator i;//用 != 比较两个迭代器for (i = v.begin(); i != v.end(); ++i)cout << *i << " ";
}

遍历(正序):
1 2 3 4 5 6 7 8 9 10
遍历(反转):
10 9 8 7 6 5 4 3 2 1

今天先到这里,后面会更详细的讲解下每一种容器使用时的注意事项。

参考:
1、C++ STL 容器库 中文文档
2、STL教程:C++ STL快速入门
3、https://www.apiref.com/cpp-zh/cpp/header.html
4、https://en.cppreference.com/w/cpp/container

相关文章:

【STL一】STL组件(容器、迭代器、算法)

【STL一】STL组件&#xff08;容器、迭代器、算法&#xff09;一、STL二、STL组件&#xff08;component&#xff09;1、stl六大组件2、C STL的13个头文件3、stl所有头文件三、容器&#xff08;container)1、序列容器&#xff08;Sequence container)——顺序容器2、关联容器&a…...

Java每日一练(20230312)

目录 1. 两数之和 II ★ 2. 反转链表 ★★ 3. 二叉树的层序遍历 II ★★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 Java 每日一练 专栏 1. 两数之和 II 给定一个已按照 非递减顺序排列 的整数数组 numbers &#xff0c;请你从数…...

Linux中sudo,su与su -命令的区别

前言 su命令就是切换用户的工具&#xff0c;怎么理解呢&#xff1f;比如我们以普通用户tom登录的&#xff0c;但要添加用户任务&#xff0c;执行useradd &#xff0c;tom用户没有这个权限&#xff0c;而这个权限恰恰由root所拥有。解决办法无法有两个&#xff0c;一是退出tom用…...

归并排序有多简单?一幅图教你看懂【C语言】

目录 归并排序的递归实现 代码实现 归并排序的非递归实现 代码实现 归并排序的思想很简单——分治法。简单地说&#xff0c;归并排序的是将序列拆分成几段子序列&#xff0c;将每一段子序列分别进行排序&#xff0c;排好之后再将有序的子序列归并&#xff08;有点像合并两…...

C++-Z字扫描实现(Zigzag Scan)

Z字扫描(Zigzag Scan) 将二维矩阵压缩成行输出&#xff1a; int index0; for(int i0;i<rowscols-1;i){//i是第几条对角线if(i&1){//odd,向下扫描for(int jmax(0,i-cols1);j<min(i,row-1);j){res[index]mtx[j][i-j];}//}else{//偶数&#xff0c;向上扫描for(int jmi…...

【华为机试真题详解 Python实现】求最大数字【2023 Q1 | 100分】

文章目录 前言题目描述输入描述输出描述示例 1示例 2题目解析参考代码前言 《华为机试真题详解》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即…...

面对数万亿产业规模,如何掘金工业互联网?

近年来&#xff0c;加速工业互联网建设的声音越来越响亮。一方面&#xff0c;政策利好&#xff0c;持续驱动。从2017年的《国务院关于深化“互联网先进制造业” 发展工业互联网的指导意见》到《工业互联网创新发展三年行动计划&#xff08;2021-2023年&#xff09;》&#xff0…...

#ifdefine #define #endif (避免头文件被重复包含的真正含义)

宏定义 首先在谈论正式话题之前&#xff0c;需要先介绍一个基础概念&#xff0c;也是前提&#xff0c;那就是宏定义。 #define demo 1 #define PI 3.14我们都知道这样会将demo 在预处理阶段替换或者说展开为1&#xff0c;Pi 替换为3.14。 #define 宏定义一个标识符来表示一个…...

单片机能运行操作系统吗?

先直接上答案&#xff1a;可以&#xff01;但是操作系统不是刚需&#xff0c;上操作系统比较占用单片机的资源&#xff0c;比如占用比较多的FLASH和RAM&#xff0c;间接增加了硬件成本&#xff0c;哪怕成本增加1毛钱&#xff0c;对于上量的产品&#xff0c;分分钟是一个工程师的…...

Python之webmagic爬虫优点与使用

一、webmagic的优点它更偏向于java的语法&#xff0c;对于熟悉java的工程师来说学习成本较低。提供多种选择器&#xff0c;如css选择器、xpath、正则等。有一个模块pipeline&#xff1a;可通过简单地配置&#xff0c;可以将爬虫抽取到的信息&#xff0c;持久化到文件、数据库等…...

代码随想录动态规划 || 121 122

Day42121. 买卖股票的最佳时机力扣题目链接给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返…...

C++STL库中不可或缺的部分—string(模拟实现)

前文大家好&#xff0c;本篇文章主要是讲解一下string一些常用接口的模拟实现。众所周知&#xff0c;在日常生活中&#xff0c;字符串无处不在&#xff0c;如just do it,中国,一坤年等&#xff0c;想要在计算机上将这些字符展现出来就需要用到string类&#xff0c;而对我们C程序…...

MySQL复合查询

文章目录基本查询回顾多表查询自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询合并查询unionunion all基本查询回顾 查询的员工部门表结构&#xff1a; mysql> show tables; ----------------- | Tables_in_scott | ----------------- | dept …...

PCIe 资料收集2

文章目录感官认识PCIe的存储空间PCIe 在 linux 下的驱动PCIe 验证1.PCIe 传递裸数据2.PCIe 转其他设备PCIe转其他总线RS232USB从用户空间理解PCIe感官认识 总线协议接口 视频介绍PCIe 视频介绍及PCIe文字介绍 PCIe上可以接各种控制器硬盘控制器硬盘声卡控制器音响咪头/耳机显…...

Linux网络编程(使用VScode远程登录ubuntu)

文章目录 前言一、SSH插件的安装1.SSH简单介绍2.SSH插件安装和配置步骤二、安装C/C++插件总结前言 本篇文章将带大家进行网络编程的准备工作,使用vscode进行远程登录ubuntu。为什么要使用vscode进行远程登录ubantu呢?因为有些小伙伴的电脑可能性能不够开启虚拟机后会导致电脑…...

如何提高项目估算精准度?关键看5大影响因子

如何让项目估算工作更加精准&#xff0c;我们需要重点关注5大调整因子。 1、功能点调整因子 首先需要对功能点因子进行调整&#xff0c;区分不同类型的系统特征值。 因为不同的系统&#xff0c;对项目开发的影响程度不同&#xff0c;一般我们把系统特征值分为14种类型&#xff…...

论文阅读笔记《Nctr: Neighborhood Consensus Transformer for Feature Matching》

核心思想 本文提出一种融合邻域一致性的Transfomer结构来实现特征点的匹配&#xff08;NCTR&#xff09;。整个的实现流程和思想与SuperGlue相似&#xff0c;改进点在于考虑到了邻域一致性。邻域一致性在许多的传统图像匹配和图匹配任务中都有应用&#xff0c;他基于一个很重要…...

上位机系统Ubuntu 20.04与下位机arduino UNO通讯

目录一、安装arduino IDE1.1安装方法1.1.1终端里命令下载&#xff08;不推荐&#xff09;1.1.2官网下载&#xff08;不推荐&#xff09;1.1.3论坛下载&#xff08;不推荐&#xff09;1.1.4系统应用商店&#xff08;推荐&#xff01;&#xff09;1.2配置项目文件位置1.3测试IDE功…...

hive面试题

1、什么是Hive Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能&#xff08;HQL&#xff09; 2、Hive的意义&#xff08;最初研发的原因&#xff09; 避免了去写MapReduce&#xff0c;提供快速开发的…...

【CUDA】《CUDA编程:基础与实践》CUDA加速的关键因素

CUDA事件计时 CUDA提供了一种基于CUDA事件(CUDA event)的计时方式&#xff0c;可用来给一段CUDA代码(可能包含主机代码和设备代码)计时。 对计时器的封装&#xff1a; class CUDATimeCost { public:void start() {elapsed_time_ 0.0;// 初始化cudaEventcheckCudaRuntime(cud…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

SpringCloud优势

目录 完善的微服务支持 高可用性和容错性 灵活的配置管理 强大的服务网关 分布式追踪能力 丰富的社区生态 易于与其他技术栈集成 完善的微服务支持 Spring Cloud 提供了一整套工具和组件来支持微服务架构的开发,包括服务注册与发现、负载均衡、断路器、配置管理等功能…...

解决MybatisPlus使用Druid1.2.11连接池查询PG数据库报Merge sql error的一种办法

目录 前言 一、问题重现 1、环境说明 2、重现步骤 3、错误信息 二、关于LATERAL 1、Lateral作用场景 2、在四至场景中使用 三、问题解决之道 1、源码追踪 2、关闭sql合并 3、改写处理SQL 四、总结 前言 在博客&#xff1a;【写在创作纪念日】基于SpringBoot和PostG…...

后端下载限速(redis记录实时并发,bucket4j动态限速)

✅ 使用 Redis 记录 所有用户的实时并发下载数✅ 使用 Bucket4j 实现 全局下载速率限制&#xff08;动态&#xff09;✅ 支持 动态调整限速策略✅ 下载接口安全、稳定、可监控 &#x1f9e9; 整体架构概览 模块功能Redis存储全局并发数和带宽令牌桶状态Bucket4j Redis分布式限…...

DL00871-基于深度学习YOLOv11的盲人障碍物目标检测含完整数据集

基于深度学习YOLOv11的盲人障碍物目标检测&#xff1a;开启盲人出行新纪元 在全球范围内&#xff0c;盲人及视觉障碍者的出行问题一直是社会关注的重点。尽管技术不断进步&#xff0c;许多城市的无障碍设施依然未能满足盲人出行的实际需求。尤其是在复杂的城市环境中&#xff…...