C++STL剖析(九)—— unordered_map和unordered_multimap的概念和使用

2023-05-16

文章目录

  • 1. unordered_map的介绍和使用
    • 🍑 unordered_map的构造
    • 🍑 unordered_map的使用
      • 🍅 insert
      • 🍅 operator[ ]
      • 🍅 find
      • 🍅 erase
      • 🍅 size
      • 🍅 empty
      • 🍅 clear
      • 🍅 swap
      • 🍅 count
  • 2. unordered_multimap的介绍和使用
    • 🍑 unordered_multimap的使用
      • 🍅 find
      • 🍅 count


1. unordered_map的介绍和使用

unordered_map 的介绍:

  • unordered_map 是存储 <key, value> 键值对的关联式容器,其允许通过keys快速的索引到与其对应的 value。
  • 在 unordered_map 中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。
  • 在内部,unordered_map 没有对 <kye, value> 按照任何特定的顺序排序,为了能在常数范围内找到 key 所对应的 value,unordered_map 将相同哈希值的键值对放在相同的桶中。
  • unordered_map 容器通过 key 访问单个元素要比 map 快,但它通常在遍历元素子集的范围迭代方面效率较低。
  • unordered_map 实现了直接访问操作符(operator[]),它允许使用 key 作为参数直接访问 value。
  • 它的迭代器至少是前向迭代器。

🍑 unordered_map的构造

构造一个 unordered_map 容器对象,根据使用的构造函数版本初始化其内容,我们主要掌握 3 种方式即可:

在这里插入图片描述

(1)构造一个某个类型的空容器

unordered_map<string, int> um1; // 构造一个key为string类型,value为int类型的空容器

(2)拷贝构造某类型容器

unordered_map<string, int> um1({ {"apple", 1}, {"lemon", 2}});
unordered_map<string, int> um2(um1); // 拷贝构造同类型容器um1的复制品

(3)使用迭代器区间进行初始化构造

构造一个 unordered_map 对象,其中包含范围 [first,last) 中每个元素的副本。

unordered_map<string, int> um1({ {"apple", 1}, {"lemon", 2}});
unordered_map<string, int> um3(um1.begin(), um1.end()); // 使用迭代器拷贝构造um1容器某段区间的复制品

🍑 unordered_map的使用

unordered_map 的成员函数主要分为:迭代器,容量操作,修改操作。

在这里插入图片描述

我这里只列举几个常用的,其它的可以看 文档 学习。

🍅 insert

在 unordered_map 中插入新元素。

只有当每个元素的键不等同于容器中已经存在的任何其他元素的键时,才会插入它,也就是说 unordered_map 中的键是唯一的。

在这里插入图片描述

(1)构造匿名对象插入

void test_unordered()
{
	// 构造对象
	unordered_map<string, double> um({ {"apple", 1.0}, {"lemon", 2.0} });

	// 构造匿名对象插入新元素
	um.insert(pair<string, double>("milk", 2.0));
	um.insert(pair<string, double>("eggs", 6.5));
	um.insert(pair<string, double>("sugar", 0.8));

	// 遍历
	for (auto e : um)
	{
		cout << e.first << ": " << e.second << endl;
	}
}

运行结果

在这里插入图片描述

(2)调用 make_pair 函数模板插入

void test_unordered()
{
	// 构造对象
	unordered_map<string, double> um({ {"apple", 1.0}, {"lemon", 2.0} });

	// 调用make_pair函数模板插入新元素
	um.insert(make_pair("milk", 2.0));
	um.insert(make_pair("eggs", 6.5));
	um.insert(make_pair("sugar", 0.8));

	// 遍历
	for (auto e : um)
	{
		cout << e.first << ": " << e.second << endl;
	}
}

运行结果

在这里插入图片描述

(3)初始化列表插入

void test_unordered()
{
	// 构造对象
	unordered_map<string, double> um({ {"apple", 1.0}, {"lemon", 2.0} });

	// 初始化列表插入新元素
	um.insert({ "sugar", 0.8 });
	um.insert({ "eggs", 6.5 });
	um.insert({ "salt", 0.1 } );

	// 遍历
	for (auto e : um)
	{
		cout << e.first << ": " << e.second << endl;
	}
}

运行结果

在这里插入图片描述

🍅 operator[ ]

如果 k 与容器中元素的键匹配,则函数返回对其映射值的引用。

如果 k 与容器中任何元素的键不匹配,该函数将插入一个具有该键的新元素,并返回对其映射值的引用。

注意:这总是将容器大小增加 1,即使没有为元素分配映射值(使用默认构造函数构造元素)。

在这里插入图片描述

(1)利用 [] 运算符重载函数进行插入

void test_unordered()
{
	// 构造对象
	unordered_map<string, double> um;

	// 利用[]运算符重载函数进行插入
	um["apple"] = 1.5;
	um["lemon"] = 2.0;
	um["sugar"] = 0.8;

	// 遍历
	for (auto e : um)
	{
		cout << e.first << ": " << e.second << endl;
	}
}

运行结果

在这里插入图片描述

(2)利用 [] 运算符重载函数进行修改

void test_unordered()
{
	// 构造对象
	unordered_map<string, double> um;

	// 利用[]运算符重载函数进行插入
	um["apple"] = 1.5;
	um["lemon"] = 2.0;
	um["sugar"] = 0.8;

	// 利用[]运算符重载函数修改value
	um["apple"] = 8.88;

	// 遍历
	for (auto e : um)
	{
		cout << e.first << ": " << e.second << endl;
	}
}

运行结果

在这里插入图片描述

总结:

  • 若当前容器中已有键值为 key 的键值对,则返回该键值对 value 的引用。
  • 若当前容器中没有键值为 key 的键值对,则先插入键值对 <key, value()>,然后再返回该键值对中 value 的引用。

🍅 find

在容器中搜索以 k 为键的元素,如果找到它,就返回一个迭代器,否则就返回 unordered_map::end(容器末端之前的元素)的迭代器。

在这里插入图片描述

代码示例

void test_unordered()
{
	// 构造对象
	unordered_map<string, double> um;

	// 利用[]运算符重载函数进行插入
	um["mom"] = 5.4;
	um["dad"] = 6.1;
	um["bro"] = 5.9;

	// 查找"dad"
	auto pos = um.find("dad");

	if (pos != um.end())
	{
		cout << pos->first << " is " << pos->second;
	}
	else
	{
		cout << "not found" << endl;
	}
}

运行结果

在这里插入图片描述

🍅 erase

从 unordered_map 容器中移除单个元素或一组元素([first,last))。

通过调用每个元素的析构函数,这有效地减少了容器的大小。

在这里插入图片描述

(1)从容器中删除单个元素(直接传要删除的元素)

void test_unordered()
{
	// 构造对象
	unordered_map<string, string> um;

	// 填充容器
	um["U.S."] = "Washington";
	um["U.K."] = "London";
	um["France"] = "Paris";
	um["Russia"] = "Moscow";
	um["China"] = "Beijing";
	um["Germany"] = "Berlin";
	um["Japan"] = "Tokyo";

	// 直接删除"Japan"
	um.erase("Japan");

	// 遍历
	for (auto e : um)
	{
		cout << e.first << ": " << e.second << endl;
	}
	
}

运行结果

在这里插入图片描述

(2)从容器中删除单个元素(搭配 find 使用)

void test_unordered()
{
	// 构造对象
	unordered_map<string, string> um;

	// 填充容器
	um["U.S."] = "Washington";
	um["U.K."] = "London";
	um["France"] = "Paris";
	um["Russia"] = "Moscow";
	um["China"] = "Beijing";
	um["Germany"] = "Berlin";
	um["Japan"] = "Tokyo";

	// 查找"Russia"的位置
	auto pos = um.find("Russia");

	if (pos != um.end())
	{
		um.erase(pos);
		cout << "delete success" << endl;
	}
	else
	{
		cout << "not found" << endl;
	}
}

运行结果

在这里插入图片描述

(3)从容器中删除一组元素(搭配 find 使用)

void test_unordered()
{
	// 构造对象
	unordered_map<string, string> um;

	// 填充容器
	um["U.S."] = "Washington";
	um["U.K."] = "London";
	um["France"] = "Paris";
	um["Russia"] = "Moscow";
	um["China"] = "Beijing";
	um["Germany"] = "Berlin";
	um["Japan"] = "Tokyo";

	// 查找"France"的位置
	auto pos = um.find("France");

	// 删除从"France"开始后面所有的元素
	um.erase(pos, um.end());

	// 遍历
	for (auto e : um)
	{
		cout << e.first << ": " << e.second << endl;
	}
}

运行结果

在这里插入图片描述

🍅 size

返回 unordered_map 容器中的元素数量。

在这里插入图片描述

代码示例

void test_unordered()
{
	// 构造对象
	unordered_map<string, double> um = { 
		{"milk", 2.30}, 
		{"potatoes", 1.90}, 
		{"eggs", 0.40} 
	};

	cout << "size: " << um.size() << endl;

	// 插入重复元素
	um["milk"] = 5.80;
	cout << "size: " << um.size() << endl;
}

运行结果

在这里插入图片描述

🍅 empty

返回一个 bool 值,指示 unordered_map 容器是否为空,即其大小是否为 0。

这个函数不会以任何方式修改容器的内容。

在这里插入图片描述

代码示例

void test_unordered()
{
	unordered_map<int, int> um1; // 构造空容器
	unordered_map<int, int> um2 = { {1,10},{2,20},{3,30} }; // 构造非空容器

	// um1是空容器,所以结果为真
	cout << "um1 " << (um1.empty() ? "is empty" : "is not empty") << endl;

	// um2不是空容器,所以结果为假
	cout << "um2 " << (um2.empty() ? "is empty" : "is not empty") << endl;
}

运行结果

在这里插入图片描述

🍅 clear

unordered_map 容器中的所有元素都将被删除,会去调用它们的析构函数,并将它们从容器中移除,使容器的大小为 0。

在这里插入图片描述

代码示例

void test_unordered()
{
	// 初始化容器
	unordered_map<string, string> um1 = {
		{"house","maison"},
		{"car","voiture"},
		{"grapefruit","pamplemousse"}
	};

	// 清空容器
	um1.clear();

	// 重新插入数据
	um1["hello"] = "bonjour";
	um1["sun"] = "soleil";

	// 遍历
	for (auto& x : um1)
	{
		cout << x.first << "=" << x.second << endl;
	}
}

运行结果

在这里插入图片描述

🍅 swap

通过 ump 的内容交换容器的内容,ump 是另一个包含相同类型元素的 unordered_map 对象,大小可能不同。

这个函数在容器之间交换指向数据的内部指针,而不实际对单个元素执行任何复制或移动,允许常量时间执行,无论大小如何。

在这里插入图片描述

代码示例

void test_unordered()
{
	// 初始化um1和um2容器
	unordered_map<string, string>
		um1 = { {"Star Wars","G"},{"Alien","R"} },
		um2 = { {"Inception","C"},{"Donnie Darko","R"} };

	// 交换两个容器的内容
	um1.swap(um2);

	// 遍历um1
	cout << "um1: ";
	for (auto& x : um1)
	{
		cout << x.first << "-" << x.second << ", ";
	}
	cout << endl;

	// 遍历um2
	cout << "um2: ";
	for (auto& x : um2)
	{
		cout << x.first << "-" << x.second << ", ";
	}
}

运行结果

在这里插入图片描述

🍅 count

在容器中搜索键为 k 的元素,并返回找到的元素数。

因为 unordered_map 容器不允许重复键,这意味着如果容器中存在具有该键的元素,则函数实际返回 1,否则返回 0。

在这里插入图片描述

代码示例

void test_unordered()
{
	// 初始化容器
	unordered_map<string, double> um = { 
		{"Burger",2.99}, 
		{"Fries",1.99}, 
		{"Soda",1.50} 
	};

	// 在um中查找下列的数据
	for (auto& x : { "Burger","Pizza","Salad","Soda" }) 
	{
		if (um.count(x) > 0)
			std::cout << "um has " << x << std::endl;
		else
			std::cout << "um has no " << x << std::endl;
	}
}

运行结果

在这里插入图片描述

2. unordered_multimap的介绍和使用

unordered_multimap 的介绍:

  • multimap 是一种关联容器,它存储由键值和映射值组合而成的元素,很像 unordered_map 容器,但是允许不同的元素具有等价的键。
  • 在 unordered_multimap 中,键值通常用于唯一标识元素,而映射值是一个对象,其内容与该键相关联。键和映射值的类型可能不同。
  • 在内部,unordered_multimap 中的元素不会根据它们的键值或映射值以任何特定的顺序进行排序,而是根据它们的散列值将它们组织到 bucket中,以允许直接通过键值快速访问单个元素(平均时间复杂度恒定)。
  • 具有等效键的元素被分组在同一个 bucket 中,并且迭代器可以遍历所有这些元素。
  • 容器中的迭代器至少是前向迭代器。

注意,这个容器不是在它自己的头文件中定义的,而是与 unordered_map 共享头文件 <unordered_map>

🍑 unordered_multimap的使用

unordered_multimap 容器与 unordered_map 容器的底层数据结构是一样的,都是哈希表。

其次,它们所提供的成员函数的接口都是基本一致的,这两种容器唯一的区别就是,unordered_multimap 容器允许键值冗余,即 unordered_multimap 容器当中存储的键值对的 key 值是可以重复的。

其次,由于 unordered_multimap 容器允许键值对的键值冗余,调用 [] 运算符重载函数时,应该返回键值为 key 的哪一个键值对的 value 的引用存在歧义,因此在 unordered_multimap 容器当中没有实现 [] 运算符重载函数。

在这里插入图片描述

代码示例

void test_unordered()
{
	// 初始化容器
	unordered_multimap<int, string> umm;

	// 插入键值对,允许重复
	umm.insert(make_pair(2023, "跑步"));
	umm.insert({ 2023, "打球" });
	umm.insert({ 2023,"玩游戏" });

	// 遍历umm
	for (auto x : umm)
	{
		cout << x.first << ": " << x.second << endl;
	}
}

可以看到,key 是可以重复的。

在这里插入图片描述

另外,它和 unordered_map 容器所提供的成员函数的接口都是基本一致的,所以就不全部列举了,只列举几个稍微有点小差别的函数接口。

🍅 find

在容器中搜索以 key 为键的元素,如果找到,则返回该元素的迭代器,否则返回 unordered_multimap::end(超出容器末端的元素)的迭代器。

也就是返回底层哈希表中第一个找到的键值为 key 的键值对的迭代器。

在这里插入图片描述

代码示例

void test_unordered()
{
	// 初始化容器
	unordered_multimap<string, string> umm;

	// 插入键值对,允许重复
	umm.insert({ "mom", "妈妈" });
	umm.insert({ "mom", "母亲" });
	umm.insert({ "dad", "父亲" });
	umm.insert({ "bro", "兄弟" });

	// 查找第一个"mom"的key,并输出对应的value
	cout << "one of the values for 'mom' is: ";
	cout << umm.find("mom")->second;
}

运行结果

在这里插入图片描述

🍅 count

在容器中搜索键为 k 的元素,并返回找到的元素个数。

在这里插入图片描述

代码示例

void test_unordered()
{
	// 初始化容器
	unordered_multimap<string, string> umm = {
		{"orange","FL"},
		{"strawberry","LA"},
		{"strawberry","OK"},
		{"pumpkin","NH"} 
	};

	// 统计下面三个单词在容器中出现的次数
	for (auto& x : { "orange","lemon","strawberry" }) 
	{
		cout << x << ": " << umm.count(x) << " 次" << endl;
	}
}

运行结果

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++STL剖析(九)—— unordered_map和unordered_multimap的概念和使用 的相关文章

  • STL 中 next_permutation 的 Python 实现

    next permutation 是一个 C 函数 它给出字符串按字典顺序排列的下一个排列 有关其实现的详细信息可以从这篇非常棒的文章中获得 http wordaligned org articles next permutation ht
  • 多线程程序中的 std::string

    鉴于 1 C 03标准没有以任何方式解决线程的存在 2 C 03 标准将其留给实现来决定是否std string应该在其复制构造函数中使用 Copy on Write 语义 3 写时复制语义通常会导致多线程程序中不可预测的行为 我得出以下看
  • 将两个 Map 合并为一个 MultiMap

    在 Java 中将两个 Map 组合成一个 Guava MultiMap 的最佳方法是什么 例如 Map1 包含 1 a 和 2 b Map2 包含 2 c 和 3 d 然后生成的组合多重贴图将包含 1 a 2 b c 和 3 d 这是我当
  • Google 地图 API 与 Multimap/Bing 地图 API

    我想知道是否有人有使用 Google Maps API 的经验和Multimap API 可以给出一个很好的理由来说明为什么一个比另一个更好 或者可能是优点和缺点的列表 我将致力于对当前使用 Multimap 经典 API 的网站进行完全重
  • 如何使用类初始化 STL 向量/列表而不调用复制构造函数

    我有一个 C 程序 它使用包含类实例的 std list 如果我打电话 例如myList push back MyClass variable 它经历创建临时变量的过程 然后立即将其复制到向量 然后删除临时变量 这远没有我想要的那么高效 而
  • C++ 中模板和 STL 的缺点 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 使用 STL 或模板有什么缺点吗 是否存在不适合的情况 首先 如果它们可以帮助您解决问题 您应该使用它们 模板是 C 非常重要的一部分 并且多年
  • C++ 中的 Java HashSet 等效项

    我很好奇 C 中是否有类似于 Java HashSet 的东西 IE 一个快速查看的数据结构 因为我只会运行 contains e 在上面 同样 如果你能启发我如何做 contains 无论您提出什么数据结构 我都会非常感激 O 请不要发帖
  • 如何将 std::map 输出到二进制文件?

    我怎样才能输出一个std map到二进制文件 地图声明如下所示 map
  • 专门化 STL 算法,以便它们在可用时自动调用高效的容器成员函数

    STL 具有全局算法 可以在任意容器上运行 只要它们支持该算法的基本要求 例如 某些算法可能要求容器具有随机访问迭代器 例如向量而不是列表 当容器具有比通用算法更快的执行方式时 它会提供具有相同名称的成员函数来实现相同的目标 就像提供自己的
  • 如何在 C++ 中将值从向量转换为映射?

    我想做这样的事情 有没有一个stl算法可以轻松做到这一点 for each auto aValue in aVector aMap aValue 1 如果您有一个对向量 其中对中的第一项将是映射的键 第二项将是与该键关联的值 您可以使用插入
  • 如何对多重映射中的键和值进行排序?

    建议使用任何方法对多重映射的键及其值进行排序 例如 输入 5 1 1 9 1 1 5 2 1 2 输出必须是 1 1 1 2 1 9 5 1 5 2 答案是emplace hint 伪代码如下所示 insert with hint M mm
  • 使用 Google Collections 创建弱多重地图

    是否有与 MultiMaps 的 MapMaker 相当的工具 目前我像这样创建缓存 public static Map
  • Windows Unicode C++ 流输出失败

    我目前正在编写一个应用程序 它要求我在任意窗口上调用 GetWindowText 并将该数据存储到文件中以供以后处理 长话短说 我注意到我的工具在 战地 3 上失败了 我将问题范围缩小到窗口标题中的以下字符 http www filefor
  • 如何确保 std::map 是有序的?

    Using a std map
  • 了解 std::swap()。 tr1::_Remove_reference 的目的是什么?

    在 VS10 的 STL 实现中 有以下 std swap 变体的代码 TEMPLATE FUNCTION Move template
  • 如何将 BOOST_FOREACH 与两个 std::map 一起使用?

    我的代码基本上如下所示 std map
  • 如何安全地将对象(尤其是 STL 对象)传入和传出 DLL?

    如何将类对象 尤其是 STL 对象 传入和传出 C DLL 我的应用程序必须以 DLL 文件的形式与第三方插件交互 并且我无法控制这些插件是使用什么编译器构建的 我知道 STL 对象没有保证的 ABI 并且我担心这会导致我的应用程序不稳定
  • std::accumulate 未按预期运行

    我使用 std accumulate 和测试代码得到了意外的结果 我正在尝试将一个大的双精度向量相加 但由于某种原因该值溢出 include
  • 递增迭代器:++it 比 it++ 更高效吗? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中 i 和 i 之间有性能差异吗 https stackoverflow com questions 24901 is there a performance difference between
  • std::vector 迭代器失效

    之前有几个关于这个问题的问题 我的理解是调用std vector erase只会使位于某个位置的迭代器无效after被擦除的元素 然而 擦除一个元素后 该位置的迭代器是否仍然有效 当然 前提是它不指向end 擦除后 我对向量如何实现的理解似

随机推荐

  • Excel线性回归分析

    文章目录 一 学习任务二 学习内容1 1 高尔顿数据集进行线性回归分析1 1 1 父母身高平均值和其中一个子女身高进行回归分析1 1 2 父子身高回归方程1 1 3 母子身高回归方程 1 2 Anscombe四重奏数据集进行回归分析 一 学
  • 组网雷达融合处理组件化设计与仿真

    人工智能技术与咨询 点击蓝色 关注我们 关键词 xff1a 组网雷达 点迹融合 航迹融合 组件化设计 仿真 摘要 数据融合处理是多雷达组网的核心 以典型防空雷达网为参考对象 xff0c 采用组件化设计方式 xff0c 将组网数据融合处理过程
  • 人工智能 知识图谱

    关于举办 2022年数字信息化培训项目系列 知识图谱Knowledge Graph构建与应用研修班线上课程的通知 各有关单位 一 培训目标 本次课程安排紧密结合理论与实践 xff0c 深入浅出 xff0c 循序渐进 从基本概念讲起 xff0
  • 深度学习(Deep Learning)

    知识关键点 1 人工智能 深度学习的发展历程 2 深度学习框架 3 神经网络训练方法 4 卷积神经网络 xff0c 卷积核 池化 通道 激活函数 5 循环神经网络 xff0c 长短时记忆 LSTM 门控循环单元 GRU 6 参数初始化方法
  • 基于深度学习的机器人目标识别和跟踪

    如今 xff0c 深度学习算法的发展越来越迅速 xff0c 并且在图像处理以及目标对象识别方面已经得到了较为显著的突破 xff0c 无论是对检测对象的类型判断 xff0c 亦或者对检测对象所处方位的检测 xff0c 深度学习算法都取得了远超
  • 零基础Linux版MySQL源码方式安装+配置+远程连接完整图解 无坑实录

    无论开发还是运维 xff0c 项目环境搞不定 xff0c 还真让你干不成活 xff0c MySQL在不同场景 不同平台下安装方式也不同 xff0c 本次主要分享centos7下MySQL源码rpm方式安装 xff0c 其它方式后续分享 xf
  • C++,友元,语法+示例,非常详细!!!!

    友元概念 友元的目的就是让一个函数或者类 访问另外一个类中的私有成员 友元的关键字为 friend 友元的几种实现 全局函数做 友元类做 友元成员函数做 友元重载函数做 友元 全局函数做 友元 include lt iostream gt
  • STL——STL简介、STL六大组件

    一 STL是什么 STL standard template library xff1a C 43 43 标准模板库 xff0c 是C 43 43 标准库的重要组成部分 xff0c 不仅是一个可复用的组件库 xff0c 还是一个包罗数据结构
  • 文件流指针和文件描述符

    1 文件流指针和文件描述符的产生 fopen函数打开文件成功后会返回文件流指针 open函数打开文件成功后返回的是文件描述符 他俩的相同点是通过文件流指针和文件描述符都可以对文件进行操作 2 fopen函数和open函数的介绍 fopen函
  • docker 操作

    查看容器 xff1a sudo docker ps a 删除容器 xff1a sudo docker rm NAMES 容器的名字 下载镜像 xff1a sudo docker pull rmus2022 server v1 2 0 查看镜
  • 树莓派32位系统烧录及连接

    目录 前言 一 烧录树莓派系统 1 格式化tf卡 2 烧录系统 二 连接树莓派 1 开启SSH 2 开启网络共享 3 下载Putty 三 开启图形化界面 非必须 最后 xff1a 前言 我在树莓派环境搭建的过程中 xff0c 看了几十篇博客
  • 鸢尾花Iris数据集进行SVM线性分类

    文章目录 一 学习任务二 学习内容1 鸢尾花数据集使用SVM线性分类1 1 SVM介绍1 2 LinearSVC xff08 C xff09 方式实现分类1 3 分类后的内容基础上添加上下边界 三 参考博客 一 学习任务 安装python3
  • intel realsense d435i相机标定中文文档

    intel realsense d435i相机标定中文文档 此文档参考了官方的英文文档 xff0c 原地址面向英特尔 实感 深度摄像头的 IMU 校准工具 intelrealsense com IMU概述 xff1a 惯性测量单元 imu
  • VScode-git提交 无法推送refs到远端

    在将代码同步到远端仓库时 xff0c 弹窗提醒 无法推送refs到远端 您可以试着运行 拉取 功能 xff0c 整合您的更改 但尝试后发现 拉取 功能也无法解决问题 xff0c 最后是因为文件过大原因 xff0c 在这里记录一下解决方法 x
  • VMware16虚拟机中安装OpenEuler详细教程指南

    文章目录 安装前提准备镜像创建虚拟机安装欧拉踩坑指南 x1f351 网络指南 安装前提 Windown 10VMware 16openEuler 20 03 LTS SP3 准备镜像 镜像地址 xff1a OpenEuler 直接在官网下载
  • C/C++排序算法(三)—— 冒泡排序和快速排序

    文章目录 前言1 冒泡排序 x1f351 基本思想 x1f351 图解冒泡 x1f351 动图演示 x1f351 代码实现 x1f351 代码优化 x1f351 特性总结 2 快速排序 x1f351 hoare 版本 x1f345 图解过程
  • C/C++排序算法(四)—— 归并排序和计数排序

    文章目录 前言1 归并排序 x1f351 基本思想 x1f351 算法图解 x1f345 分组 x1f345 归并 x1f345 比较 x1f351 动图演示 x1f351 代码实现 x1f351 非递归实现 x1f345 情况一 x1f3
  • C++深入浅出(九)—— 多态

    文章目录 1 多态的概念2 多态的定义及实现 x1f351 多态的构成条件 x1f351 虚函数 x1f351 虚函数的重写 x1f351 虚函数重写的两个例外 x1f351 C 43 43 11的override 和 final x1f3
  • C++STL剖析(八)—— unordered_set和unordered_multiset的概念和使用

    文章目录 前言1 unordered set的介绍和使用 x1f351 unordered set的构造 x1f351 unordered set的使用 x1f345 insert x1f345 find x1f345 erase x1f3
  • C++STL剖析(九)—— unordered_map和unordered_multimap的概念和使用

    文章目录 1 unordered map的介绍和使用 x1f351 unordered map的构造 x1f351 unordered map的使用 x1f345 insert x1f345 operator x1f345 find x1f