欢迎访问 生活随笔!

凯发ag旗舰厅登录网址下载

当前位置: 凯发ag旗舰厅登录网址下载 > 编程语言 > c/c >内容正文

c/c

c 11 中stl库中新增内容 -凯发ag旗舰厅登录网址下载

发布时间:2025/1/21 c/c 32 豆豆
凯发ag旗舰厅登录网址下载 收集整理的这篇文章主要介绍了 c 11 中stl库中新增内容 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

c 11一个比较显著的变化是以前boost库中的一些函数被正式标准化合入到stl中了,本文就简单的介绍一下。

引用包装器(reference wrapper)

当模板函数参数为泛型类型的时候,无法推导出是传值还是传引用,默认情况下会使用传值的方式。这是我们可以用std::ref显式指定以传引用的方式实例化模板函数。

    #include
    #include

    template <class t>
    void foo(t arg)
    {
        arg ;
    }

    int main()
    {
        int count = 3;

        foo(count);        //
此时传的是值,模板实例化为
foo(int)count值不变
        std::cout << count << std::endl;

        foo(
std::ref(count));    //
此时传的是引用,模板实例化为foo(int&)count值加1
        std::cout << count << std::endl;
    }

智能指针(smart pointers)

智能指针主要引入了shared_ptr、weak_ptr、unique_ptr三种,其中shared_ptr和weak_ptr就是boost库中的应对象,我以前也写过相关文章介绍他们,这里就不介绍了。

而新引入的unique_ptr和以前介绍过的boost库中的scoped_ptr比较类似,而stl中本身就有一个类似的auto_ptr,它们之间的主要区别是:

  • auto_ptr可以支持'='操作,也可作为函数的返回值
  • unique_ptr不支持'='操作,可以作为函数的返回值
  • scoped_ptr即不支持'='操作,也不能作为函数的返回值

相比较而言,unique_ptr权限比auto_ptr小,也没有scope_ptr不能作为返回值的限制,是用起来最合适的,完全可以代替auto_ptr

仿函数

四个boost库也合入了stl库中:

  • function
  • bind
  • result_of
  • mem_fn

其中function和bind我以前在介绍boost库中已经介绍过,在支持auto关键字后,通过bind创建function更加简单了,我们只需要用一句话就能创建成员函数的仿函数。

    #include
    #include
    using namespace std;
    
using namespace std::placeholders;

    struct x
    {
        bool foo (int a) { cout<< a << endl; return false;}
    };

    int main()
    {
        x x;

        
auto func = bind(&x::foo, &x, _1);
        func(5);
    }

ps:使用bind的时候需要加入std::placeholders的using,否则编译报语法错误。

不过感觉bind基本上被lambda表达式给秒了,对于上面例子里,用lambda表达式的写法如下:

    auto func = [&x](int a) { x.foo(a); };
    function<void (int)> func = [&x](int a) { x.foo(a); };

由于lambda表达式是语法糖,因此可读性方面更好(感觉简洁度都快接近c#的匿名函数了),没有_1,_2之类的占位符,对于函数的调用方式也是显式直接调用,更加直观。

而result_of在auto引入后感觉也基本上没有用了,直接使用auto要简单得多。

容器

容器方面主要加了如下几个:

  • tuple
  • array
  • unordered_set和unordered_map
  • 其中tuple和array基本上就是boost相关库给标准化了,而unordered_set和unordered_map则是hash表方式的set和map,以提供更高的查询性能。使用方式和原来二叉树版的也大同小异,这里就不多介绍了。

    正则表达式

    boost的regex库也终于标准化了,要使用字符串处理的可以不用到处找第三方的正则表达式库了。不过目前vc还不支持像c#那样取消转义字符(gcc可以),在代码里面的正则表达式依然非常难读,希望ms能尽快把raw string literal给支持上。

    线程

    boost的线程库也标准化了,另外那个类似于.net tpl库的packaged_task也标准化了,由于它有不少可以介绍的地方,我会专门写篇文章来介绍它,这里就不多说了。

    时间函数

    其实c语言标准库是提供了时间函数的,不过极度难用,现在boost的时间函数chrono已经给标准化了,虽然还是比不上.net的timespan好用,但起码比标准c的那套好太多了。

        #include
        #include
        #include
        using namespace std;

        int fibonacci(int n)
        {
            if (n < 3) return 1;
            return fibonacci(n-1) fibonacci(n-2);
        }

        int main()
        {
            auto start = chrono::system_clock::now();
            int result = fibonacci(40);
            auto end = chrono::system_clock::now();

            int elapsed_seconds = chrono::duration_castmilliseconds>
                                     (end-start).count();

            auto end_time = chrono::system_clock::to_time_t(end);

            std::cout << "result: " << result << endl
                     << "finished computation at " << std::ctime(&end_time)
                     << "elapsed time: " << elapsed_seconds << "ms\n";
        }

    另外一个日期函数boost.date好像还没有标准化,要用到日期相关功能还是只能用boost库。

    总结

    以上是凯发ag旗舰厅登录网址下载为你收集整理的c 11 中stl库中新增内容的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得凯发ag旗舰厅登录网址下载网站内容还不错,欢迎将凯发ag旗舰厅登录网址下载推荐给好友。

    • 上一篇:
    • 下一篇:
    网站地图