专栏首页owentC++ 新特性学习(二) -- Array、Tuple和Hash库

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 条评论
登录 后参与评论

相关文章

  • C++ 新特性学习(四) — Bind和Function

    木有错,这是C++,并且很方便地实现了委托 这就是传说中的绑定库和增强型的函数对象 接下来一个一个来

    owent
  • C++总是很神奇

    很多时候看到C/C++的一些奇妙的应用,每次都是惊奇一点时间就随风飘过了 现在我还是决定记录一下这些有意思的东西。

    owent
  • VC和GCC成员函数指针实现的研究(三)

    因为是兼容虚继承和非虚继承的,所以赋值的部分的汇编是一样的。这里就不贴了。关键在于执行期它是怎么找到虚基类的。请往下看:

    owent
  • C++11异步编程(std::async, std::future, std::packaged_task, std::promise)

           std::async是一个函数模板,会启动一个异步任务,最终返回一个std::future对象。在之前我们都是通过thread去创建一个子线程,但...

    Ch_Zaqdt
  • (二)Reactor模式

    最近一直在看游双的《高性能linux服务器编程》一书,下载链接: http://download.csdn.net/detail/analogous_love/...

    范蠡
  • (二)Reactor模式

    最近一直在看游双的《高性能linux服务器编程》一书,下载链接: http://download.csdn.net/detail/analogous_love/...

    范蠡
  • C++/C++11中头文件cmath的使用

    <math.h>是C标准函数库中的头文件。在C++中一般用<cmath>。此头文件中声明了一系列函数来计算常见的数学运算和变换:

    用户7886150
  • C++/C++11中头文件cmath的使用

    <math.h>是C标准函数库中的头文件。在C++中一般用<cmath>。此头文件中声明了一系列函数来计算常见的数学运算和变换:

    用户7886150
  • 现代 C++:右值引用、移动语意、完美转发

    右值引用(rvalue reference)是 C++11 为了实现移动语意(move semantic)和完美转发(perfect forwarding)而提...

    linjinhe
  • [C++11札记]: std::function

    在C/C++中函数指针作为一种回调机制被广泛使用,但是函数指针在C++面向对象编程中有些不足,比如无法捕捉上下文。举个例子,使用对象的非静态成员函数作为函数指针...

    云水木石

扫码关注云+社区

领取腾讯云代金券