您好,登录后才能下订单哦!
这篇文章主要介绍“C++ Boost Array与Unordered怎么使用”,在日常操作中,相信很多人在C++ Boost Array与Unordered怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++ Boost Array与Unordered怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
Boost.Array 库在 boost/array.hpp 中定义了类模板 boost::array。 boost::array 与 std::array 类似,后者是使用 C++11 添加到标准库中的。如果您使用 C++11 开发环境,则可以忽略 boost::array。
使用 boost::array,可以创建一个与 C 数组具有相同属性的数组。此外,boost::array 符合 C++ 容器的要求,这使得处理这样的数组就像处理任何其他容器一样容易。原则上,可以将 boost::array 视为容器 std::vector,但 boost::array 中的元素数量是恒定的。
示例 14.1。 boost::array 的各种成员函数
#include <boost/array.hpp> #include <string> #include <algorithm> #include <iostream> int main() { typedef boost::array<std::string, 3> array; array a; a[0] = "cat"; a.at(1) = "shark"; *a.rbegin() = "spider"; std::sort(a.begin(), a.end()); for (const std::string &s : a) std::cout << s << '\n'; std::cout << a.size() << '\n'; std::cout << a.max_size() << '\n'; }
如示例 14.1 所示,使用 boost::array 相当简单,不需要额外解释,因为调用的成员函数与来自 std::vector 的成员函数具有相同的含义。
Boost.Unordered
Boost.Unordered 提供类 boost::unordered_set、boost::unordered_multiset、boost::unordered_map 和 boost::unordered_multimap。这些类与使用 C++11 添加到标准库中的散列容器相同。因此,如果您使用支持 C++11 的开发环境,则可以忽略 Boost.Unordered 中的容器。
示例 15.1。使用 boost::unordered_set
#include <boost/unordered_set.hpp> #include <string> #include <iostream> int main() { typedef boost::unordered_set<std::string> unordered_set; unordered_set set; set.emplace("cat"); set.emplace("shark"); set.emplace("spider"); for (const std::string &s : set) std::cout << s << '\n'; std::cout << set.size() << '\n'; std::cout << set.max_size() << '\n'; std::cout << std::boolalpha << (set.find("cat") != set.end()) << '\n'; std::cout << set.count("shark") << '\n'; }
boost::unordered_set 可以替换为示例 15.1 中的 std::unordered_set。 boost::unordered_set 与 std::unordered_set 没有区别。
示例 15.2。使用 boost::unordered_map
#include <boost/unordered_map.hpp> #include <string> #include <iostream> int main() { typedef boost::unordered_map<std::string, int> unordered_map; unordered_map map; map.emplace("cat", 4); map.emplace("shark", 0); map.emplace("spider", 8); for (const auto &p : map) std::cout << p.first << ";" << p.second << '\n'; std::cout << map.size() << '\n'; std::cout << map.max_size() << '\n'; std::cout << std::boolalpha << (map.find("cat") != map.end()) << '\n'; std::cout << map.count("shark") << '\n'; }
Example15.2
示例 15.2 使用 boost::unordered_map 来存储几种动物的名称和腿数。再一次,boost::unordered_map 可以替换为 std::unordered_map。
示例 15.3。使用 Boost.Unordered 的用户定义类型
#include <boost/unordered_set.hpp> #include <string> #include <cstddef> struct animal { std::string name; int legs; }; bool operator==(const animal &lhs, const animal &rhs) { return lhs.name == rhs.name && lhs.legs == rhs.legs; } std::size_t hash_value(const animal &a) { std::size_t seed = 0; boost::hash_combine(seed, a.name); boost::hash_combine(seed, a.legs); return seed; } int main() { typedef boost::unordered_set<animal> unordered_set; unordered_set animals; animals.insert({"cat", 4}); animals.insert({"shark", 0}); animals.insert({"spider", 8}); }
在示例 15.3 中,动物类型的元素存储在 boost::unordered_set 类型的容器中。由于 boost::unordered_set 的哈希函数不知道类动物,因此无法自动计算此类元素的哈希值。这就是为什么必须定义散列函数的原因——否则无法编译示例。
要定义的哈希函数的名称是 hash_value()。它必须期望作为其唯一参数的类型的对象应该计算哈希值。 hash_value() 的返回值类型必须是 std::size_t。
当必须为对象计算哈希值时,会自动调用函数 hash_value()。此函数是为 Boost 库中的各种类型定义的,包括 std::string。对于动物等用户定义的类型,它必须由开发者定义。
通常,hash_value() 的定义相当简单:通过一个接一个地访问对象的成员变量来创建哈希值。这是通过函数 boost::hash_combine() 完成的,该函数由 Boost.Hash 提供并在 boost/functional/hash.hpp 中定义。如果使用 Boost.Unordered,则不必包含此头文件,因为此库中的所有容器都访问 Boost.Hash 来计算哈希值。
除了定义 hash_value() 之外,您还需要确保可以使用 == 比较两个对象。这就是示例 15.3 中运算符 operator== 为动物重载的原因。
C++11 标准库中的散列容器使用头文件中的散列函数函数。 Boost.Unordered 的散列容器需要散列函数 hash_value()。是否在 hash_value() 中使用 Boost.Hash 并不重要。 Boost.Hash 是有意义的,因为像 boost::hash_combine() 这样的函数可以更容易地从多个成员变量逐步计算哈希值。然而,这只是 hash_value() 的一个实现细节。除了使用不同的散列函数之外,Boost.Unordered 的散列容器和标准库中的散列容器基本上是等价的。
到此,关于“C++ Boost Array与Unordered怎么使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。