C++ 新特性学习(二) -- Array、Tuple和Hash库

这回的两个库没怎么用过,这里的记录就用VC++写了,使用G++和BOOST的时候和智能指针类似。

首先是Tuple

要注意的是这里G++,VC++和BOOST库的函数不太一样,所以使用的时候要注意没有使用到编译器和编译器相关的函数(特别是IDE的弹窗的方法要注意)。

比如VC++和G++里的tuple对象没有get方法,而boost里有,所以获取数据智能用get(tuple&)语句。

这是个多元数组,最多有10个元素,用于方便定义复杂逻辑结构。例如std::pair就是一个2元tuple 使用tuple要求指定的类型支持默认构造方法

#include <cstdio>
#include <string>
#include <tuple>
#include <iostream>

struct foo {
    int m;
    friend bool operator< (const foo& l, const foo& r) {
        return l.m < r.m;
    }
    friend bool operator==(const foo& l, const foo& r) {
        return l.m == r.m;
    }
};

int main() {
    std::tuple<int, std::string, double, foo> tup0,
        tup1 = std::tuple<int, std::string, double, foo>(2, "2", 1.0, foo());
    tup0 = std::make_tuple(1, "2", 3.0, foo());

    // 比较操作符是从左向右比较的,但是要求所有元素支持比较操作
    std::cout<< (tup0 < tup1)<< std::endl;
    // 对其中元素的操作比较特别
    std::get<3>(tup1).m = std::get<3>(tup0).m = 1;
    std::get<0>(tup1) = 1;
    std::get<2>(tup1) = 3.0;
    // 相等比较符也一样
    std::cout<< (tup0 == tup1)<< std::endl;

    return 0;
}

功能是比较强大,但是为什么我觉得用处不大呢?

另一个库是Array

这个东西就如其名,就是一个数组。普通数组不支持STL,而当std::vector效率不满足需求的时候array的力量就出来了,使用不是一般的简单。

std::array<int> arr = {0, 1, 2, 3, 4, 5, 6};

for(std::array<int>::size_type i = 0; i < arr.size(); i ++)
    std::cout<< arr[i]<< " = " << arr.at(i)<< std::endl;

最后一个啦,hash

主要是用来计算hash值的,采用FNV哈希算法,还可以用于管理数据结构(如tr1里的std::unordered_set)。默认支持的计算散列值的对象是整型、小数、指针和字符串,其他的结构需要自己定制HASH函数,按照boost的文档指定hash函数的方法很简单,就是重写std::size_t hash_value(T const&)方法或函数,我使用boost库正常,但是VC++下用tr1编译错误,错误在自定义hash函数上,但没看懂报错的原因,也没有详细的例子或文档。另外貌似重载==操作符也是必须的

#include <cstdio>
#include <string>
#include <functional>
#include <unordered_set>
#include <array>
#include <iostream>
#include <assert.h>
#include <boost/functional/hash.hpp>
using namespace std;

struct foo {
    int id;
    int m;
    foo(int _id): id(_id){}
    void print(void*) {
        printf("%d\n", m);
    }
    friend bool operator == (const foo& l, const foo& r) {
        return l.id == r.id;
    }
};

std::size_t hash_value(const foo& f) {
    return boost::hash<int>()(f.id);
}

int main() {
    std::hash<std::string> str_hash;
    std::hash<int> int_hash;
    std::cout<< str_hash("OWenT")<< std::endl;
    std::cout<< int_hash(3)<< std::endl; // 输出不是3哦


    std::unordered_set<foo, boost::hash<foo> > s;
    foo f(3);
    s.insert(f);
    assert(s.find(foo(3)) != s.end());

    return 0;
}

这个以后等需要用的时候再继续研究吧

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

C++智能指针简单剖析

http://blog.csdn.net/lanxuezaipiao/article/details/41603883

6910
来自专栏机器学习从入门到成神

设计模式之静态工厂、工厂方法和抽象工厂的联系与区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

9420
来自专栏前端知识分享

第169天:面向对象基础概念(有待完善)

函数——面向对象 函数——工具 对象——工具包(把类似的功能放在一起管理) 工具:函数——方法

11720
来自专栏Java 源码分析

数据结构Generic

​ 接下来我们要处理的是前面实现里另一个 根本性的缺陷 那些实现只适用于字符串,想要实现其他类型数据的队列和栈怎么办呢? 这个问题就涉及泛型的话题了。 ​...

34640
来自专栏Java学习网

Java中提高代码复用性的方法及规范总结

一个好的程序员一定是用最少的代码实现最多的功能,代码复用是程序员所追求和期望的,这也是Java语言所提倡的;根据以往开发经验整理了一些能够提高代码复用性方法和规...

47570
来自专栏HappenLee的技术杂谈

C++雾中风景番外篇:理解C++的复杂声明与声明解析

在编写C/C++代码时偶尔能看到如下的复杂声明:float(*(*e[10])(int*))[5]。我想你的第一反应一定是:MMP。虽然我们在实际工作之中是很少...

9620
来自专栏java学习

Java每日一练(2017/8/16)

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Android视频更新了!(回复【安卓视频】获取下载链接) ●【新】Ajax知识点视频更新了!(回复【学习...

30960
来自专栏CDA数据分析师

码如其人,同学你能写一手漂亮的Python函数吗

与多数现代编程语言一样,在 Python 中,函数是抽象和封装的基本方法之一。你在开发阶段或许已经写过数百个函数,但并非每个函数都生而平等。写出「糟糕的」函数会...

15430
来自专栏程序员互动联盟

【编程基础】盖大楼地基要牢固

水之积也不厚,则其负大舟也无力。——庄子 上一篇讲了几个编译编辑器,大家都可以用用,新手掌握几个是没有坏处的。 学编程要从基础学起,就像盖大楼,先把地基打好,...

38090
来自专栏微信公众号:Java团长

Java基础04 封装与接口

总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型。对象可以有状态和动作,即数据成员和方法。

17420

扫码关注云+社区

领取腾讯云代金券