cpp-utilities, 其他C++11实用程序类和函数

分享于 

9分钟阅读

GitHub

  繁體 雙語
Miscellaneous C++11 utility classes and functions
  • 源代码名称:cpp-utilities
  • 源代码网址:http://www.github.com/eteran/cpp-utilities
  • cpp-utilities源代码文档
  • cpp-utilities源代码下载
  • Git URL:
    git://www.github.com/eteran/cpp-utilities.git
    Git Clone代码到本地:
    git clone http://www.github.com/eteran/cpp-utilities
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/eteran/cpp-utilities
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    实用程序

    其他C++11实用程序类和函数

    哈希库

    MD5.hMD5.cpp,SHA1.h 和SHA1.cpp。

    就像你所期望的,这是MD5和SHA1哈希算法的实现。 两者的用法是相同的,为便于使用而设计。

    
    //create an MD5 object and give it some data
    
    
    hash::MD5 hasher("Hello World");
    
    
    hasher.append('!');//you can stream new values in as you please
    
    
    auto digest = hasher.finalize();//create a digest for"Hello World!"
    
    
    std::cout <<digest.to_string() <<std::endl;
    
    
    
    

    注意:一件事要注意,我觉得它是一个不错的设计特征。 finalize() 不修改hasher的内部状态,它将以最终形式返回摘要的副本。 这意味着你可以调用 finalize(),然后继续向hasher添加新数据,再次调用 finalize(),并获得正确的散列。

    竞技场分配器

    arena.h 中找到。 这是一个非常有效的固定块大小arena分配器的实现。 它允许分配和释放竞技场( 如果你愿意,那是不必要的),并且根据你需要的块大小,使用两种策略之一。 如果块小于指针的大小,而场景相对较小,则它将使用位图和编译器内部查找。 如果块至少与指针一样大,那么它将使用一个空闲列表实现。 模板演绎将为你选择最佳的后端。

    使用费用非常高,简单:

    
    //create an arena of 1024 64-bit blocks 
    
    
    auto arena = memory::make_arena<sizeof(uint64_t), 1024>();
    
    
    auto p1 = arena.allocate();//get a single uint64_t sized block
    
    
    arena.release(p1);//free that block back into the system 
    
    
    //(not necessary, the arena will clean itself up)
    
    
    
    

    在我的系统中,使用空闲分配策略时分配函数,分配的开销为条指令。 其中一些是简单的nullptr 检查。

    Bitset实用程序函数

    bitset.h 中找到。 这个 header 提供了一个很好的实用函数,可以在bitset中找到第一个集合位。 如果可以能使用,进行 O(1) 时间,但是在不可以能的情况下退回迭代实现。

    
    std::bitset<32> bs;
    
    
    bs[4] = true;
    
    
    bs[10] = true;
    
    
    int bit_l = bitset::find_first(bs);//returns 4
    
    
    int bit_h = bitset::find_last(bs);//returns 10
    
    
    
    

    函数定义为在没有位设置时返回 bitset.size(),这类似于返回 .end() 以查找操作的容器。

    位运算

    提供了高效和类型安全的旋转操作,可以与任何整型类型一起使用。 未来版本可以使用内部文件实现,但是现在它是一个相当直接的转移和掩码解决方案。 在启用优化时,gcc常常会将这一点减少到单个 rol 指令 !

    
    int x = 5;
    
    
    int y = bitwise::rotate_right(x, 15);
    
    
    int x = bitwise::rotate_left(x, 20);
    
    
    
    

    字符串实用程序函数

    提供了一些常用的字符串函数,如修剪。上/下套管。测试它开始和结束的内容等。

    算法

    algorithm.h 是用于通用用途的一组算法。 目前还有一些可以变参数最小和最大函数的编译时间。 例如:

    
    int n = algorithm::static_max(1, 2, 3, 10, 5, 6);
    
    
    printf("%dn", n);//prints 10
    
    
    
    

    因为它是编译时常量,所以你也可以安全地在模板中使用它。 例如:

    
    template <int N>
    
    
    struct Foo {
    
    
     static const int value = N * 2;
    
    
    };
    
    
    
    int main() {
    
    
     int n = Foo<algorithm::static_max(1, 2, 3, 10, 5, 6)>::value;
    
    
     printf("%dn", n);//prints 20
    
    
    }
    
    
    
    

    当然,编译器必须对 constexpr 有良好的支持:- )。

    漂亮的打印机

    pprint.h 是一组实用函数,用于以"pretty"方式打印公共 C++ 数据结构。 类似于php的print_r()。用法类似于:

    
    std::vector<int> v = { 1, 2, 3, 4, 5, 6, 7 };
    
    
    std::cout <<pprint::to_string(v) <<std::endl;
    
    
    
    

    它将打印:

    
    std::vector<>
    
    
    (
    
    
     [0] => 1
    
    
     [1] => 2
    
    
     [2] => 3
    
    
     [3] => 4
    
    
     [4] => 5
    
    
     [5] => 6
    
    
     [6] => 7
    
    
    )
    
    
    
    

    支持 std::vectorstd::liststd::dequestd::setstd::map。 此外,容器的复杂嵌套应该能很好地工作。 例如向量列表:

    
    std::list<std::vector<int>> v = { {1, 2, 3}, {4, 5, 6, 7} };
    
    
    std::cout <<pprint::to_string(v) <<std::endl;
    
    
    
    

    将打印:

    
    std::list<>
    
    
    (
    
    
     [0] => std::vector<>
    
    
     (
    
    
     [0] => 1
    
    
     [1] => 2
    
    
     [2] => 3
    
    
     )
    
    
     [1] => std::vector<>
    
    
     (
    
    
     [0] => 4
    
    
     [1] => 5
    
    
     [2] => 6
    
    
     [3] => 7
    
    
     )
    
    
    )
    
    
    
    

    定点数学

    Fixed.h

    这是c++11的一个定点数学类。 it的组合是整数和小数部分,无效组合会产生编译器错误,当前实现会产生编译器错误,当前实现使用 static assert 使这里更易于读取。 它应该是本机 float 类型替换的好记。 下面是一个用法示例:

    
    typedef numeric::Fixed<16, 16> fixed;
    
    
    fixed f;
    
    
    
    

    这将声明一个 16.16个定点数字。 运算符的使用虽然使用了 boost::operators。 在 numeric::multiplynumeric::divide的自由函数中实现乘法和除法,使用 std::enable_if 来选择最佳选项。 如果有较大的类型可用,它将使用精确和快速的数学版本。 如果没有可以用的较大类型,那么它将退回较慢的乘法和仿真除法( 但不幸的是)。 这个系统允许用户根据需要对乘法和除法进行专门化。

    平面关联容器

    FlatMap.h

    这是 std::map的实现,但使用一个连续的数据结构( std::vector ) 作为底层存储。 元素按键排序,因此查找应该像 binary_search 一样高效,迭代和访问 std::vector 一样高效。

    FlatSet.h

    这是 std::set的实现,但使用一个连续的数据结构( std::vector ) 作为底层存储。 元素按键排序,因此查找应该像 binary_search 一样高效,迭代和访问 std::vector 一样高效。


      FUNC  函数  UTIL  UTI  工具  
    相关文章