c++map和set剖析

news2024/11/17 3:44:48

在这里插入图片描述
文章参考文献:cplusplus
博主:拖拉机厂第一代码手
gitee:拖拉机厂第一代码手
c++专栏:C++


目录

  • 🧙🏼‍♂set剖析
    • 🧚🏼set简介
    • 🧚🏼set模板参数列表
    • 🧚🏼set构造函数
    • 🧚🏼set迭代器
    • 🧚🏼set容量
    • 🧚🏼set修改操作
  • 🧙🏻‍♀map剖析
    • 🧚🏿‍♂️map简介
    • 🧚🏿‍♂️map模板参数列表
    • 🧚🏿‍♂️map构造函数
    • 🧚🏿‍♂️map迭代器
    • 🧚🏿‍♂️map容量
    • 🧚🏿‍♂️map修改操作
    • 🧚🏿‍♂️map元素访问
  • 🎅🏻总结


🧙🏼‍♂set剖析

🧚🏼set简介

set是一种按照一定次序存储元素的容器。在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改,但是可以从容器中插入或删除它们。

在内部,set中的元素总是按照其内部比较对象所指示的特定严格弱排序准则进行排序。这意味着set中的元素是有序的,可以根据排序准则进行访问和操作。

set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。这使得set在需要有序存储和操作元素的场景中非常有用。

set在底层是用二叉搜索树(红黑树)实现的。这种数据结构保证了插入、删除和查找操作的平均时间复杂度都是O(log n),使得set具有高效的性能。

总的来说,set是一种有序、唯一的容器,适用于需要按照一定顺序存储和操作元素的场景。它提供了丰富的成员函数和迭代器,方便对元素进行插入、删除、查找和遍历操作。

🧚🏼set模板参数列表

在这里插入图片描述
其中:

  • T:表示set中存储的元素类型。
  • Compare:表示元素的比较函数对象类型,默认为std::less,即按照元素的小于关系进行排序。可以自定义比较函数来指定排序规则。
  • Alloc:表示分配器类型,默认为std::allocator,用于分配内存。

可以根据需要自定义这些模板参数,例如指定自定义的比较函数或分配器。

🧚🏼set构造函数

在这里插入图片描述
set类提供了多个构造函数,可以根据不同的需求进行对象的初始化。以下是常用的构造函数:

  1. 默认构造函数:
set (const key_compare& comp = key_compare(),
	const allocator_type& alloc = allocator_type());

创建一个空的set对象。

  1. 范围构造函数:
set (InputIterator first, InputIterator last, 
	const Compare& comp = Compare(), const Allocator& = Allocator() );

使用范围 [first, last) 内的元素初始化set对象。要求元素类型必须支持复制构造函数。

  1. 拷贝构造函数:
set (const set& x);

使用另一个set对象x中的元素创建一个新的set对象。

需要注意的是,C++98标准中没有提供移动构造函数和初始化列表构造函数。如果需要使用移动构造函数、初始化列表构造函数或者自定义比较函数和分配器的版本,可以考虑使用C++11及更高版本的标准库。

🧚🏼set迭代器

在这里插入图片描述

set类提供了多种迭代器,用于遍历容器中的元素。以下是set的迭代器类型:

  • iterator:用于遍历set中的元素,并且可以修改元素的值。

  • const_iterator:用于遍历set中的元素,但不能修改元素的值。

这两种迭代器都支持前向遍历,即可以使用++操作符将迭代器指向下一个元素。

set类提供了以下成员函数来获取迭代器的起始和结束位置:

函数含义
begin()返回一个迭代器,指向set中第一个元素的位置。
end()返回一个迭代器,指向set中最后一个元素之后的位置。
rbegin()返回一个逆向迭代器,指向set中最后一个元素的位置。
rend()返回一个逆向迭代器,指向set中第一个元素之前的位置。

使用set的迭代器可以进行遍历、访问和修改元素的操作。例如,可以使用迭代器来遍历set中的元素并打印它们的值:

set<int> mySet = {1, 2, 3, 4, 5};

// 使用迭代器遍历并打印元素
for (set<int>::iterator it = mySet.begin(); it != mySet.end(); ++it) {
    cout << *it << " ";
}

在这里插入图片描述

需要注意的是,set中的元素是按照升序排列的,因此使用迭代器遍历时会按照升序顺序访问元素。

另外,set还提供了reverse_iterator和const_reverse_iterator类型的迭代器,用于逆向遍历set中的元素。可以使用rbegin()和rend()成员函数获取逆向迭代器的起始和结束位置。例如:

set<int> mySet = {1, 2, 3, 4, 5};

// 使用逆向迭代器遍历并打印元素
for (set<int>::reverse_iterator rit = mySet.rbegin(); rit != mySet.rend(); ++rit) {
    cout << *rit << " ";
}

在这里插入图片描述

这样会按照降序顺序访问set中的元素。

需要注意的是,end()和rend()返回的迭代器并不指向set中的有效元素,而是指向最后一个元素之后的位置。因此在遍历时,通常使用!=来判断迭代器是否到达结束位置。

🧚🏼set容量

在这里插入图片描述
set类提供了一些成员函数来获取容器的容量信息。以下是set的容量相关的成员函数:

  1. size():返回set中元素的个数。

  2. empty():检查set是否为空,如果为空则返回true,否则返回false。

  3. max_size():返回set对象能够容纳的最大元素数量。

这些成员函数可以用于获取set的容量信息。例如,可以使用size()函数获取set中元素的个数:

set<int> mySet = {1, 2, 3, 4, 5};

cout << "Size of set: " << mySet.size() << endl;

在这里插入图片描述

可以使用empty()函数检查set是否为空:

set<int> mySet;

if (mySet.empty()) {
    cout << "Set is empty" << endl;
} else {
    cout << "Set is not empty" << endl;
}

在这里插入图片描述

这些函数对于判断set是否为空或者获取set中元素的个数非常有用。

另外,set类还提供了一个成员函数max_size(),用于返回set对象能够容纳的最大元素数量。max_size()函数返回的是一个整数,表示set对象能够容纳的最大元素数量。这个值取决于操作系统和编译器的限制。

set<int> mySet;

cout << "Maximum size of set: " << mySet.max_size() << endl;

在这里插入图片描述

需要注意的是,max_size()返回的是一个理论上的最大值,实际上可能由于系统资源限制而无法达到这个值。因此,在使用set时应该根据实际情况进行内存和资源的管理。

🧚🏼set修改操作

set容器是一种有序的容器,不允许直接修改容器中的元素值。这是因为set容器中的元素是根据其值进行排序的,直接修改元素的值可能导致元素的顺序发生改变,破坏了set容器的有序性。
在这里插入图片描述

然而,可以使用erase()函数删除set容器中的元素,然后使用insert()函数插入一个新的元素来实现间接的修改操作。

set容器提供了以下成员函数用于插入、删除、交换和清空元素:

  1. insert():用于将元素插入set容器中。插入操作的时间复杂度为O(log N),其中N是set中元素的数量。有以下几种用法:

insert(value):将value插入set中。
insert (position, value):将value插入到position的位置。
insert(first, last):将[first, last)范围内的元素插入set中。

  1. erase():用于从set容器中删除元素。删除操作的时间复杂度为O(log N),其中N是set中元素的数量。有以下几种用法:

erase(value):删除set中与value相等的元素。
erase(iterator):删除迭代器指向的元素。
erase(first, last):删除[first, last)范围内的元素。

  1. swap():用于交换两个set容器的内容。交换操作的时间复杂度为O(1)。有以下几种用法:

swap(set1, set2):交换set1和set2的内容。

  1. clear():用于清空set容器中的所有元素。清空操作的时间复杂度为O(N),其中N是set中元素的数量。

以下是一个示例代码,演示了如何使用这些成员函数:

#include <iostream>
#include <set>

int main() 
{
    std::set<int> mySet;

    // 插入元素
    mySet.insert(5);
    mySet.insert(3);
    mySet.insert(8);

    // 删除元素
    mySet.erase(3);

    // 交换容器内容
    std::set<int> anotherSet;
    anotherSet.insert(10);
    anotherSet.insert(20);
    mySet.swap(anotherSet);

    // 清空容器
    mySet.clear();
    
    return 0;
}

在这里插入图片描述

🧙🏻‍♀map剖析

🧚🏿‍♂️map简介

map是C++标准库中的关联容器之一,它提供了一种以键值对(Key-Value)形式存储和访问元素的方式。map容器中的元素是按照键的顺序进行排序的,并且每个键只能出现一次。

特点:

  1. map中的元素是按照键的顺序进行排序的,默认情况下是按照键的升序排列。

  2. 在map中,键值(key)通常用于排序和唯一标识元素,而值(value)存储与键值关联的内容。键值和值的类型可以不同,但在map内部,键值和值通过成员类型value_type绑定在一起,取别名为pair<const key, T>。

  3. map中的元素是自动根据键进行排序的,因此可以通过键快速查找、插入和删除元素。

  4. map支持下标访问符([]),可以通过键值获取对应的值。

  5. map通常是基于红黑树实现的,因此插入、删除和查找操作的平均时间复杂度为O(log N),其中N是map中元素的数量。

🧚🏿‍♂️map模板参数列表

在这里插入图片描述

  • Key:键类型,表示map中的键值类型。
  • T:值类型,表示map中存储的值类型。
  • Compare:比较函数类型,用于指定键的比较方式。默认情况下,使用std::less,即使用键类型的小于运算符进行比较。
  • Alloc:分配器类型,用于指定内存分配策略。默认情况下,使用std::allocator来分配内存。

🧚🏿‍♂️map构造函数

在这里插入图片描述

map容器提供了多个构造函数,可以根据不同的需求来创建map对象。以下是一些常用的构造函数:

  1. 默认构造函数:
map (const key_compare& comp = key_compare(),
              const allocator_type& alloc = allocator_type());

创建一个空的map对象。

  1. 区间构造函数:
map (InputIterator first, InputIterator last,
       const key_compare& comp = key_compare(),
       const allocator_type& alloc = allocator_type());

使用[first, last)范围内的元素来构造map对象。要求范围内的元素类型必须能够隐式转换为std::pair<const Key, T>。

  1. 拷贝构造函数:
map (const map& x);

使用另一个map对象otherMap中的元素来构造新的map对象。

🧚🏿‍♂️map迭代器

在这里插入图片描述
map类提供了多种迭代器,用于遍历容器中的元素。以下是map的迭代器类型:

  • iterator:用于遍历map中的元素,并且可以修改元素的值。

  • const_iterator:用于遍历map中的元素,但不能修改元素的值。

这两种迭代器都支持前向遍历,即可以使用++操作符将迭代器指向下一个元素。

map迭代器的常用操作有:

  • begin():返回指向map中第一个元素的迭代器。
  • end():返回指向map中最后一个元素之后位置的迭代器,通常用于判断循环结束的条件。
  • rbegin():返回指向map中最后一个元素的逆向迭代器。
  • rend():返回指向map中第一个元素之前位置的逆向迭代器。

下面是一个示例代码,展示了如何使用map迭代器以及一些常用的函数操作:

#include <iostream>
#include <map>
using namespace std;

int main()
{
	map<string, string> translate{ make_pair("apple", "苹果"), make_pair("banana", "香蕉"), make_pair("bear", "梨")};

    // 使用迭代器遍历translate
    cout << "正向遍历" << endl;
    map<string, string>::iterator it;
    for (it = translate.begin(); it != translate.end(); ++it) {
        cout << "Key: " << it->first << ", Value: " << it->second << endl;
    }

    //使用逆向迭代器遍历translate
    cout << "逆向遍历" << endl;
    map<string, string>::reverse_iterator rit;
    for (rit = translate.rbegin(); rit != translate.rend(); ++rit) {
        cout << "Key: " << rit->first << ", Value: " << rit->second << endl;
    }
	return 0;
}

在这里插入图片描述

🧚🏿‍♂️map容量

在这里插入图片描述
map提供了一些方法来获取容器的容量信息,下面是关于map容量和元素访问的一些常用方法:

  • empty():判断map是否为空,如果为空则返回true,否则返回false。
	map<int, string> myMap{ make_pair(1, "a"), make_pair(2, "b"), make_pair(3, "c") };
	if (myMap.empty()) {
		cout << "Map is empty" << endl;
	}
	else {
		cout << "Map is not empty" << endl;
	}

在这里插入图片描述

  • size():返回map中元素的个数。
	map<int, string> myMap{ make_pair(1, "a"), make_pair(2, "b"), make_pair(3, "c") };

	cout << "Map size: " << myMap.size() << endl;

在这里插入图片描述

  • max_size():该方法用于获取map能容纳的最大元素个数。这是由底层实现和系统限制决定的,因此它可能会因系统而异。
	map<int, string> myMap{ make_pair(1, "a"), make_pair(2, "b"), make_pair(3, "c") };

	cout << "Max map size: " << myMap.max_size() << endl;

在这里插入图片描述

🧚🏿‍♂️map修改操作

在这里插入图片描述

map提供了多种方法来修改容器中的元素,以下是一些常用的map修改操作方法:

  • insert函数:用于向map中插入新的键值对。它有多个重载版本,可以接受不同的参数类型。常见的用法包括:
	map<int, string> myMap;
	myMap.insert(make_pair(1, "apple")); // 插入键值对
	myMap.insert(pair<int, string>(2, "bear"));
	myMap.insert(map<int, string>::value_type(3, "banana"));

在这里插入图片描述
如果插入的键已经存在于map中,insert函数不会更新该键对应的值。

  • erase函数:用于从map中删除指定的键值对。它有多个重载版本,可以接受不同的参数类型。常见的用法包括:
	map<int, string> myMap{ make_pair(1, "a"), make_pair(2, "b"), make_pair(3, "c") };
	myMap.erase(2);

在这里插入图片描述

  • swap函数:用于交换两个map的内容。它接受一个map作为参数,并将两个map的内容进行交换。用法如下:
	map<int, string> myMap1{ make_pair(1, "a"), make_pair(2, "b"), make_pair(3, "c") };
	map<int, string> myMap2{ make_pair(1, "apple"), make_pair(2, "banana"), make_pair(3, "bear") };

	myMap1.swap(myMap2);

在这里插入图片描述

  • clear函数:用于清空map中的所有键值对,使map成为空容器。用法如下:
map<int, string> myMap{ make_pair(1, "apple"), make_pair(2, "banana"), make_pair(3, "bear") };
// 填充myMap的内容
myMap.clear(); // 清空myMap中的所有键值对

在这里插入图片描述

🧚🏿‍♂️map元素访问

map提供了一些方法来查找元素和访问元素的值。

以下是关于map的find、count和operator[]方法的介绍:

  • find(key):该方法用于查找键为key的元素。如果找到,它返回一个指向该元素的迭代器;如果找不到,它返回一个指向map中最后一个元素之后位置的迭代器(即end()迭代器)。
	map<int, string> myMap{make_pair(1, "a"), make_pair(2, "b"), make_pair(3, "c")};
	map<int, string>::iterator it = myMap.find(2);
	if (it != myMap.end()) {
		cout << "Found: " << it->second << endl;
	}
	else {
		cout << "Not Found" << endl;
	}

在这里插入图片描述

  • count(key):该方法用于计算键为key的元素在std::map中的个数。由于std::map中键是唯一的,因此返回值只能是0或1。如果元素存在,则返回1;如果元素不存在,则返回0。
	map<int, string> myMap{ make_pair(1, "a"), make_pair(2, "b"), make_pair(3, "c") };
	int count = myMap.count(2);
	if (count > 0) {
		cout << "Element exists" << endl;
	}
	else {
		cout << "Element does not exist" << endl;
	}

在这里插入图片描述

  • operator:该方法用于通过键访问对应的值。如果键存在,则返回对应的值;如果键不存在,则会插入一个新的键值对,并返回默认构造的值。
	map<int, string> myMap{ make_pair(1, "a"), make_pair(2, "b"), make_pair(3, "c") };
	string value1 = myMap[2];
	string value2 = myMap[4];
	cout << "Value at key 2: " << value1 << endl;
	cout << "Value at key 4: " << value2 << endl;

在这里插入图片描述
在这里插入图片描述

需要注意的是,使用operator[]方法访问不存在的键时,会自动插入一个新的键值对到map中,这可能会改变map的大小。

🎅🏻总结

C++中的map和set是标准库中的两个关联容器,它们都提供了高效的数据存储和检索功能。下面是对map和set的文章总结:

map:

  1. map是一个有序的关联容器,它存储了一系列的键值对,并根据键的值进行排序。
  2. 每个键值对都是唯一的,即每个键只能对应一个值。
  3. 可以使用insert函数添加新的键值对,使用erase函数删除指定的键值对,使用[]运算符访问和修改键对应的值。
  4. map提供了快速的查找操作,可以根据键的值进行快速的检索。
  5. map的底层实现是红黑树,因此插入、删除和查找操作的时间复杂度都是对数级别的。

set:

  1. set是一个有序的关联容器,它存储了一系列的唯一元素,并根据元素的值进行排序。
  2. 每个元素都是唯一的,即每个元素只能出现一次。
  3. 可以使用insert函数添加新的元素,使用erase函数删除指定的元素。
  4. set提供了快速的查找操作,可以根据元素的值进行快速的检索。
  5. set的底层实现也是红黑树,因此插入、删除和查找操作的时间复杂度都是对数级别的。

map和set都是非常有用的容器,可以在许多场景下使用。它们提供了高效的数据存储和检索功能,并且保持了元素的有序性和唯一性。在需要存储键值对或需要快速查找和删除元素的情况下,map和set都是不错的选择。

最后,如果觉得文章对你有帮助的话就来一个大大的👍吧。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型中常用的分词器Tokenizer学习总结记录与代码实现

最近大模型领域内如火如荼&#xff0c;很多企业、个人组织都陆续进入这个领域&#xff0c;笔者最近也是在接触大模型相关的技术领域&#xff0c;本文的主要目的就是想记录总结汇总大模型常用到的分词器算法&#xff0c;总结记录&#xff0c;学习备忘&#xff01;由于博主本身知…

巨人互动|Google海外户Google Analytics的优缺点是什么?

Google Analytics是一个由谷歌开发的网站分析工具&#xff0c;旨在帮助网站和移动应用程序运营者收集和分析数据&#xff0c;以更好地了解用户行为和改进业务。虽然Google Analytics具有许多优势&#xff0c;但也存在一些缺点。在本文中&#xff0c;我们将探讨Google Analytics…

cuda安装

1.cuda 11.8网址 CUDA Toolkit 11.8 Downloads | NVIDIA Developer 2.安装 sh cuda_11.8.0_520.61.05_linux.run 直接accept 移动上下到driver上&#xff0c;再enter一下取消driver的更新 更新一下.bashrc&#xff0c;cp -r ~/.bashrc xxx export PATH/usr/local/cuda-11.…

慢慢来,这次一定能搞懂Promise

1.Promise到底是个什么东西&#xff1f; 让我们使用万能console打印一下它的内容。 根据控制控制台的输出可见Promise 是一个构造函数&#xff0c;本身身上有 all、reject、resolve 这几个方法&#xff0c;原型&#xff08;prototype&#xff09;上有 then、catch 等方法。 根…

JVM源码剖析之Java命令行参数全解

最近&#xff0c;有一位网友询问关于Java命令行参数方面的问题&#xff0c;因为在Java中参数有很多种&#xff0c;有不少的读者一直没弄明白&#xff0c;所以特意写下此篇文章。 此篇文章分2大块&#xff0c;第一块是不同参数的解释&#xff0c;第2块就是JVM源码论证&#xff…

理解 Python 的 for 循环

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 在本篇博客中&#xff0c;我们将讨论 Python 中 for 循环的原理。 我们将从一组基本例子和它的语法开始&#xff0c;还将讨论与 for 循环关联的 else 代码块的用处。 然后我们将介绍迭代对象、迭代器和迭代器协议&…

低代码平台——减少开发bug,解放程序员

目录 一、前言 二、低代码提供了哪些功能 三、低代码对程序员的好处 四、小结 一、前言 在计算机语言的世界里&#xff0c;一直存在着一个千奇百怪的生物——bug。bug产生的本质是因为写代码&#xff0c;于是一种真理就诞生了。真理如下&#xff1a;只要写代码&#xff0c;就会…

【多维定向滤波器组和表面波】表面变换:用于高效表示多维 s 的多分辨率变换(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

信创麒麟操作系统卸载docker,并分别用在线、yum、rpm三种方式安装信创的docker

备注&#xff1a;操作前建议对机器打快照备份&#xff0c;或者备份好数据&#xff0c;如未使用&#xff0c;第一次部署的情况可直接操作 一、卸载DataEase自带的docker # 停止服务 service dataease stop# 删除 docker 可执行文件 rm -f /usr/bin/containerd-shim-runc-v2 r…

快速解决IDEA中类的图标变成J,不是C的情况

有时候导入新的项目后&#xff0c;会出现如下情况&#xff0c;类的图标变成J&#xff0c;如图&#xff1a; 直接上解决方法: 找到项目的pom.xml&#xff0c;右键&#xff0c;在靠近最下方的位置找到Add as Maven Project&#xff0c;点击即可。 此时&#xff0c;一般类的图标就…

【springboot项目】在idea中启动报错合集

一、IDEA中报错 “Error running ‘Application‘: Command line is too long.“ 的解决办法 报错详情&#xff1a; Error running Application: Command line is too long.Shorten command line for Application or also for Spring Boot default configuration.报错原因&am…

校对软件助力公安公检:提高调查报告质量

校对软件可以为公安公检机关提供有力支持&#xff0c;帮助提高调查报告的质量。以下是校对软件在这方面的助力&#xff1a; 1.拼写和语法检查&#xff1a;校对软件可以自动检查调查报告中的拼写错误和语法问题。这可以避免由于疏忽或拼写错误而导致的报告不准确或难以理解的情况…

TENNECO EDI 项目——X12与XML之间的转换

近期为了帮助广大用户更好地使用 EDI 系统&#xff0c;我们根据以往的项目实施经验&#xff0c;将成熟的 EDI 项目进行开源。用户安装好知行之桥EDI系统之后&#xff0c;只需要下载我们整理好的示例代码&#xff0c;并放置在知行之桥指定的工作区中&#xff0c;即可开始使用。 …

java Spring Boot yml多环境配置

我们项目 线上和线下 环境配置不是特别一样 例如 运行的URL 数据库地址 数据库的账号密码 这些经常是不一样的 如果每次上线钱改 也不是特别方便 甚至可能忘记 那么 进入我们代码中 所谓的多环境 就是在不同的环境下配置不同的值 终端还是在application配置文件中 多环境的话…

【网络编程】万字详解||一个简单TCP服务器(TCP、线程池、守护进程)源码+介绍

TCP服务器 锁&#xff1a;Lock.hpp代码介绍 守护进程&#xff1a;daemonize.hpp代码说明 日志文件&#xff1a;log.hpp代码说明 任务处理 Task.hpp代码说明 线程池 ThreadPool.hpp代码说明 客户端 TCPClient.cc代码说明 服务器 TCPServer.cc代码说明 头文件包 util.hpp代码 Mak…

【工程实践】使用Roformer-sim(SimBERTv2 )做数据增强

前言 此文仅记录以Roformer-sim为基础模型做数据增强的过程&#xff0c;Roformer-sim模型细节请移步&#xff1a;SimBERTv2来了&#xff01;融合检索和生成的RoFormer-Sim模型 - 科学空间|Scientific Spaces https://github.com/ZhuiyiTechnology/roformer-sim 1.功能介绍 可以…

[LeetCode - Python]344.反转字符串(Easy);345. 反转字符串中的元音字母(Easy);977. 有序数组的平方(Easy)

1.题目 344.反转字符串(Easy) 1.代码 class Solution:def reverseString(self, s: List[str]) -> None:"""Do not return anything, modify s in-place instead."""# 双指针left,right 0, len(s)-1while left < right:temp s[left]s[…

利用PCL实现点云配准

一、介绍 This document demonstrates using the Iterative Closest Point algorithm in your code which can determine if one PointCloud is just a rigid transformation of another by minimizing the distances between the points of two pointclouds and rigidly tran…

Ishikawa

Ishikawa 石川、鱼骨头、因果 其实我压根不知道 Ishikawa 这个日文就是石川&#xff0c;^_^&#xff0c;视乎也没啥影响

fastadmin动态获取单选框选中值修改页面

需求场景&#xff1a; 在编辑页面中&#xff0c;要求要根据某一单选框&#xff08;字段名称popup&#xff09;的选中值&#xff0c;来动态显示或者隐藏某个div&#xff08;idupload_img&#xff09;。 edit: function () {var popVal $("input[typeradio][namerow[popup]…