C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器upper_bound(x)) 改 一旦插入就无法修改,只能先删再增 查 a.find(x) != a.end() 或者 a.count(x) set 系列成员函数总结 函数 含义 set multiset unordered_set insert(x) 插入一个元素 x √ √ √ erase(x) 删除所有等于 x 的元素 √ √ √ count(x) 有多少个等于 x 的元素 √ , 0 或 1 √ √ , C++11 新增: unordered_set 容器 • set 会让元素从小到大排序 。 • 而 unordered_set 不会排序 ,里面的元素都是完全随机 的顺序,和插入的顺序也不 一样。虽然你可能注意到这 里的刚好和插入的顺序相反 ?巧合而已,具体怎么顺序 是和 glibc 实现有关的。 • set 基于红黑树实现,相当 于二分查找 树, unordered_set 基于散 列哈希表实现,正是哈希函 有序 查找 插入 vector × × O(n) O(1) ~ O(n) set √ √ O(logn) O(logn) multiset × √ O(logn) O(logn) unordered_set √ × O(1) O(1) unordered_multiset × × O(1) O(1) 不同版本的 set 容器比较 类型 头文件 lower/upper_bound equal_range0 码力 | 83 页 | 10.23 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器(BV1m34y157wb) ,我们已经讲了 set 容器,特点是自动去重 + 高效查找。 • set 容器中的类型通过模板来指定: set• set 容器又可以分为 set 、 multiset 、 unordered_set 、 unordered_multiset 四类。 • set 容器和 map 的相似之处在于他的底层实现都是二叉排序树,现在让我们来鞋习一下他吧 。 vector 查找为什么低效 k k k k k k k k k v v v v v v set map 第四章:哈希散列表 高效的查找离不开我 高效的查找离不开我 unordered_set 查找为什么高效 • 为什么哈希散列表 unorered_set 会比线性数组 vector 在查找这一点上更高效? • 你看,我们刚才只判断了 3 次就找到了目标。这还是最坏的情况,最好只需要 次大小判断,就能找到任 意一个数!因为算法复杂度可以忽略 +1 -1 这些小东西,所以 set 查找的最坏复杂度是 O(1) ! 4 要找的数 从 unordered_set 到 unordered_map :无非是外挂了个值类型 • 刚刚说明了 unordered_set 是如何在 O(1) 复杂度内找到任意元素的。 • unordered_map 也一样,只不过是在每个 K 后面外挂了一个 0 码力 | 90 页 | 8.76 MB | 1 年前3
Hello 算法 1.0.0b1 C++版graphBFS(GraphAdjList &graph, Vertex *startVet) { // 顶点遍历序列 vectorres; // 哈希表,用于记录已被访问过的顶点 unordered_set visited = { startVet }; // 队列用于实现 BFS queue que; que.push(startVet); // 来记录已被访问的顶点,以避免重复访问顶点。 // === File: graph_dfs.cpp === /* 深度优先遍历 DFS 辅助函数 */ void dfs(GraphAdjList& graph, unordered_set & visited, vector & res, Vertex* vet) { res.push_back(vet); // 记录访问顶点 visited graphDFS(GraphAdjList& graph, Vertex* startVet) { // 顶点遍历序列 vector res; // 哈希表,用于记录已被访问过的顶点 unordered_set visited; dfs(graph, visited, res, startVet); 9. 图 hello‑algo.com 150 return res; 0 码力 | 187 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0b2 C++版graphBFS(GraphAdjList &graph, Vertex *startVet) { // 顶点遍历序列 vectorres; // 哈希表,用于记录已被访问过的顶点 unordered_set visited = { startVet }; // 队列用于实现 BFS queue que; que.push(startVet); // 来记录已被访问的顶点,以避免重复访问顶点。 // === File: graph_dfs.cpp === /* 深度优先遍历 DFS 辅助函数 */ void dfs(GraphAdjList& graph, unordered_set & visited, vector & res, Vertex* vet) { res.push_back(vet); // 记录访问顶点 visited graphDFS(GraphAdjList& graph, Vertex* startVet) { // 顶点遍历序列 vector res; // 哈希表,用于记录已被访问过的顶点 unordered_set visited; dfs(graph, visited, res, startVet); return res; } 深度优先遍历的算法流程如下图所示,其中 ‧ 0 码力 | 197 页 | 15.72 MB | 1 年前3
Hello 算法 1.0.0b4 C++版graphBFS(GraphAdjList &graph, Vertex *startVet) { // 顶点遍历序列 vectorres; // 哈希表,用于记录已被访问过的顶点 unordered_set visited = {startVet}; // 队列用于实现 BFS queue que; que.push(startVet); // 来记录已被访问的顶点,以避免重复访问顶点。 // === File: graph_dfs.cpp === /* 深度优先遍历 DFS 辅助函数 */ void dfs(GraphAdjList &graph, unordered_set &visited, vector &res, Vertex *vet) { res.push_back(vet); // 记录访问顶点 visited graphDFS(GraphAdjList &graph, Vertex *startVet) { // 顶点遍历序列 vector res; // 哈希表,用于记录已被访问过的顶点 unordered_set visited; dfs(graph, visited, res, startVet); 9. 图 hello‑algo.com 179 return res; 0 码力 | 343 页 | 27.39 MB | 1 年前3
Hello 算法 1.1.0 C++ 版graphBFS(GraphAdjList &graph, Vertex *startVet) { // 顶点遍历序列 vectorres; // 哈希表,用于记录已被访问过的顶点 unordered_set visited = {startVet}; // 队列用于实现 BFS queue que; que.push(startVet); // 来记录已被访问的顶点,以避免重复访问顶点。 // === File: graph_dfs.cpp === /* 深度优先遍历辅助函数 */ void dfs(GraphAdjList &graph, unordered_set &visited, vector &res, Vertex *vet) { res.push_back(vet); // 记录访问顶点 visited graphDFS(GraphAdjList &graph, Vertex *startVet) { // 顶点遍历序列 vector res; // 哈希表,用于记录已被访问过的顶点 unordered_set visited; dfs(graph, visited, res, startVet); return res; } 深度优先遍历的算法流程如图 9‑12 所示。 0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0b5 C++版graphBFS(GraphAdjList &graph, Vertex *startVet) { // 顶点遍历序列 vectorres; // 哈希表,用于记录已被访问过的顶点 unordered_set visited = {startVet}; // 队列用于实现 BFS queue que; que.push(startVet); // 来记录已被访问的顶点,以避免重复访问顶点。 // === File: graph_dfs.cpp === /* 深度优先遍历 DFS 辅助函数 */ void dfs(GraphAdjList &graph, unordered_set &visited, vector &res, Vertex *vet) { res.push_back(vet); // 记录访问顶点 visited graphDFS(GraphAdjList &graph, Vertex *startVet) { // 顶点遍历序列 vector res; // 哈希表,用于记录已被访问过的顶点 unordered_set visited; dfs(graph, visited, res, startVet); 第 9 章 图 hello‑algo.com 203 return res; 0 码力 | 377 页 | 30.69 MB | 1 年前3
Hello 算法 1.0.0 C++版graphBFS(GraphAdjList &graph, Vertex *startVet) { // 顶点遍历序列 vectorres; // 哈希表,用于记录已被访问过的顶点 unordered_set visited = {startVet}; // 队列用于实现 BFS queue que; 第 9 章 图 hello‑algo.com 201 来记录已被访问的顶点,以避免重复访问顶点。 // === File: graph_dfs.cpp === /* 深度优先遍历辅助函数 */ void dfs(GraphAdjList &graph, unordered_set &visited, vector &res, Vertex *vet) { res.push_back(vet); // 记录访问顶点 visited graphDFS(GraphAdjList &graph, Vertex *startVet) { // 顶点遍历序列 vector res; // 哈希表,用于记录已被访问过的顶点 unordered_set visited; dfs(graph, visited, res, startVet); return res; } 深度优先遍历的算法流程如图 9‑12 所示。 0 码力 | 378 页 | 17.59 MB | 1 年前3
Hello 算法 1.2.0 简体中文 C++ 版graphBFS(GraphAdjList &graph, Vertex *startVet) { // 顶点遍历序列 vectorres; // 哈希集合,用于记录已被访问过的顶点 unordered_set visited = {startVet}; // 队列用于实现 BFS queue que; que.push(startVet); // 来记录已被访问的顶点,以避免重复访问顶点。 // === File: graph_dfs.cpp === /* 深度优先遍历辅助函数 */ void dfs(GraphAdjList &graph, unordered_set &visited, vector &res, Vertex *vet) { res.push_back(vet); // 记录访问顶点 visited graphDFS(GraphAdjList &graph, Vertex *startVet) { // 顶点遍历序列 vector res; // 哈希集合,用于记录已被访问过的顶点 unordered_set visited; dfs(graph, visited, res, startVet); return res; } 深度优先遍历的算法流程如图 9‑12 所示。 0 码力 | 379 页 | 18.48 MB | 10 月前3
现代C++ 教程:高速上手C++11/14/17/20O(constant),在不关心容器内部元素顺序时,能够获得显著的性能提升。 C++11 引入了的两组无序容器分别是:std::unordered_map/std::unordered_multimap 和 std::unordered_set/std::unordered_multiset。 它们的用法和原有的 std::map/std::multimap/std::set/set::multiset 基本类似,由于这些容0 码力 | 83 页 | 2.42 MB | 1 年前3
共 10 条
- 1













