读书频道 > 网站 > 网页设计 > 深入应用C++11:代码优化与工程级应用
2.5 unordered container无序容器
15-07-07    下载编辑
收藏    我要投稿   
在StackOverflow的最近一次世界性调查中,C++11在所有的编程语言中排名第二, C++11受到程序员的追捧是毫不意外的,因为它就像C++之父Bjarne Stroustrup说的:它看起来就像一门新的语言。C++11新增加了相当多的立即去当当网订购

C++11增加了无序容器unordered_map/unordered_multimap和unordered_set/unordered_multiset,由于这些容器中的元素是不排序的,因此,比有序容器map/multimap和set/multiset效率更高。map和set内部是红黑树,在插入元素时会自动排序,而无序容器内部是散列表(Hash Table),通过哈希(Hash),而不是排序来快速操作元素,使得效率更高。由于无序容器内部是散列表,因此无序容器的key需要提供hash_value函数,其他用法和map/set的用法是一样的。不过对于自定义的key,需要提供Hash函数和比较函数。代码清单2-6是无序容器的基本用法。

代码清单2-6 无序容器的基本用法

#include <unordered_map>
#include <vector>
#include <bitset>
#include <string>
#include <utility>
struct Key {
         std::string f?irst;
         std::string second;
};

struct KeyHash {
         std::size_t operator()(const Key& k) const
         {
                  return std::hash<std::string>()(k.f?irst) ^
                           (std::hash<std::string>()(k.second) << 1);
         }
};

struct KeyEqual {
         bool operator()(const Key& lhs, const Key& rhs) const
         {
                  return lhs.f?irst == rhs.f?irst && lhs.second == rhs.second;
         }
};

int main()
{
         // default constructor: empty map
         std::unordered_map<std::string, std::string> m1;

         // list constructor
         std::unordered_map<int, std::string> m2 =
         {
                  {1, "foo"},
                  {3, "bar"},
                  {2, "baz"},
         };

         // copy constructor
         std::unordered_map<int, std::string> m3 = m2;

         // move constructor
         std::unordered_map<int, std::string> m4 = std::move(m2);

         // range constructor
         std::vector<std::pair<std::bitset<8>, int>> v = { {0x12, 1}, {0x01,-1} };
         std::unordered_map<std::bitset<8>, double> m5(v.begin(), v.end());

         // constructor for a custom type
         std::unordered_map<Key, std::string, KeyHash, KeyEqual> m6 = {
                  { {"John", "Doe"}, "example"},
                  { {"Mary", "Sue"}, "another"}
         };
}

对于基本类型来说,不需要提供Hash函数和比较函数,用法上和map/set一样,对于自定义的结构体,就稍微复杂一些,需要提供函数和比较函数。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站