STL(一)之新语言特性

新语言特性

  • nullptr被解释为一个void*,不同于NULL被解释为一个int
  • 可以用auto在编译期完成自动推导,不会影响执行期的速度
  • 新的for循环方式:
for(decl : coll)
{
    statement
}
  • rvalue reference也是一个reference,也就是说,下面这段代码是无效的:
X&& foo()
{
    X x;
    return std::move(x);
}
  • 关键字:expllicit意味着在对象构造期间不能有显式类型转换
  • 关键字:noexcept用来表示某个函数不打算抛出异常。异常出现在运行期而非编译期,但是运行期的异常会使得编译器产生额外的指令代码。可在析构函数,swap函数,move构造函数和move assignment操作符使用此声明。总之,和资源管理相关的函数都不应该抛出异常.
void foo() noexcept
  • 关键字:constexpr可用来让表达式核定于编译器。
  • 关键字:mutable修饰任何情况下都可变的变量,即使该变量被const修饰
  • Lambda表达式:
int x,y;
auto lambda = [x,&y]()->double{return 42+x*y;};
  • 关键字:decltype用于描述表达式类型,两种基本用法:
int x,y;

decltype(x+y) add(int x,int y);
auto add(int x,int y) -> decltype(x+y);

通用工具

  • 对于tuplepair元素来说:
std::tuple<int,std::string,std::vector<int>> tupple;
auto one = std::get<0>(tupple);
auto two = std::get<1>(tupple);
auto three = std::get<2>(tupple);

可以获得pair或者tuple中的元素。
pair默认实现<比较运算符,且以first的值作为比较的对象。

  • shared_ptrunique_ptr的用法:
shared_ptr<int> ptr(new int[10],[](int* array){delete [] array;});
unique_ptr<int,void(*)(int*)> uptr(new int[10],[](int* array){delete [] array;});
ptr.get();   //获得指向资源的裸指针,若为空,返回nullptr
ptr.use_count();    //返回共享计数
ptr.unique();    //返回是否唯一
  • weak_ptr详解:shared_ptr的高级用法:将this指针转化为shared_ptr类型交由回调函数处理

    • 解决:两个shared_ptr循环引用的问题
    • 解决:想要共享但是不想拥有的状况
    std::shared_ptr<std::string> strPtr;
    std::weak_ptr<std::string> strWPtr = strPtr;
    auto newPtr = strWPtr.lock();    //将WPtr升级为Ptr
    strWPtr.expired();    //如果Wptr有共享对象,返回True,速度快于use_count
    strWPtr.use_count();    //返回Ptr的共享个数
class Find : public std::enable_shared_from_this<Find>
{
    ...
    ...
    auto thisPtr = shared_from_this();
}
  • 使用Function Object作为上述Smart Pointer的删除器,以减少函数运行期的开销
  • <cstring>常用函数:
memchr(const void* ptr,int c,size_t len);
memcmp(const void* ptr1,const void* ptr2,size_t len);
memcpy(void* toPtr,const void* fromPtr,size_t len);
memmove(void* toPtr,const void* fromPtr,size_t len);
memset(void* ptr,int c,size_t len);

STL概述

  • 安插型迭代器 Insert Iterator串流迭代器 Stream Iterator

    • Back_Insert:安插于容器的最末端
    • Front_Insert:安处于容器的最前端
    • General_Insert:安插于容器的指定位置
      下述例程将list中的所有元素安插到vector的最末端:
    list<int> list{1,2,3,4,5,6,7,8,9};
    vector<int> vector;
    std::copy(list.begin(),list.end(),back_inserter(vector));
    back_inserter(container);//尾安插
    front_inserter(container);//头安插
    inserter(container,pos);//pos安插
std::vector<std::string> vecStream;
std::copy(std::istream_iterator<std::string>(std::cin),std::istream_iterator<std::string>(),std::back_inserter(vecStream));
std::sort(vecStream.begin(),vecStream.end());
std::unique_copy(vecStream.cbegin(),vecStream.cend(),std::ostream_iterator<std::string>(std::cout,"\n"));
  • 任何“以迭代器访问容器“的泛型算法,都无法通过通过迭代器调用容器类所提供的任何成员函数。
  • 在任何情况下,优先选用容器本省的成员函数,其次才是泛型算法
  • Move迭代器
std::list<std::string> s;
...
std::vector<std::string> vec(s.begin(),s.end());    //copy
std::vector<std::string> vec(make_move_iterator(s.begin(),s.end()));    //move
  • 单个判断式Predicate:会返回bool类型的数据作为排序准则或者查找准则。
  • 双参判断式:Binary Predicate

参考博客园大佬,以后可能会用到,有的暂时还没遇见过,大佬就是牛逼

原文地址:https://www.cnblogs.com/xcb-1024day/p/11332451.html

时间: 2024-11-10 10:41:45

STL(一)之新语言特性的相关文章

C# 3.0新语言特性和改进(一)

引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3.0新语言特性和改进包括: 自动属性 隐含类型局部变量 匿名类型 对象与集合初始化器 扩展方法 Lambda表达式和Lambda表达式树 1. 自动属性 自动属性可以避免我们编写实体类时声明私有变量和get/set的逻辑,取而代之的是,编译器会自动为你生成一个私有变量和默认的get/set 操作. 在

Java8新语言特性

Java8简明指南 欢迎来到Java8简明指南.本教程将一步一步指导你通过所有新语言特性.由短而简单的代码示例,带你了解如何使用默认接口方法,lambda表达式,方法引用和可重复注解.本文的最后你会熟悉最新的API的变化如Stream,Fcuntional,Map API扩展和新的日期API. 接口的默认方法 在Java8中,利用default关键字使我们能够添加非抽象方法实现的接口.此功能也被称为扩展方法,这里是我们的第一个例子: interface Formula { double calc

在C#6.0中的新语言特性

孙广东    2015.6.5 What's New in C# 6: http://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Whats-New-in-C-6 Cross Platform Development系列:http://channel9.msdn.com/Shows/CZSK-videa/Cross-Platform-Development-1-Introduction Developer Productivity: What's

阿里巴巴资深技术专家雷卷:值得开发者关注的 Java 8 后时代的语言特性

作者 |?阿里巴巴资深技术专家? 雷卷,GitHub ID @linux-china 导读:在?Python.JavaScript 等一众编程语言崛起风靡之际,一代霸主 Java 风采虽不及当年,但仍横扫了各大编程语言排行榜,依旧是各大企业级应用开发语言中的 NO.1.从?Java?8 之后,Java 引入了很多有用的新语言特性,以及新工具和性能改善.但是仍有非常多的同学在日常开发中没有切换到 Java 8 的后续版本.本篇文章将侧重开发方向,为大家介绍后 Java 8 时代的特性. 首先我们必

Atitit.&#160;Object-c语言&#160;的新的特性&#160;&#160;attilax总结

Atitit. Object-c语言 的新的特性  attilax总结 1.1. Object-C语言由 Brad J.Cox于20世纪80年代早期设计,1 1.2. Object-C新增的数据结构:1 1.3. 类扩展1 1.4. 动态特性 Object-C中一个强大的特性就是它的动态因素.2 1.5. 多重继承的偏方  一个类可以实现若干的协议,从这个角度实现了类的多重继承.2 1.6. 实体方法   静态函数  减号“-”  加号“+” 声明2 1.7. 调用方法:Objective-C里

Go的语言特性总结

写在前面: 近来关于对Golang的讨论有很多,七牛的几个大牛们也断定Go语言在未来将会快速发展,并且很可能会取代Java成为互联网时代最受欢迎的编程语言.Go语言是google推出的编程语言,在已经成功的给世人创造了改变人们生活的操作系统之后,google似乎感觉有必要再为世人带来一款强大的编程语言,而Go语言依靠自己众多友好的特性也不负众望正在被开发者接触,我有幸在学习高性能并发编程的时候认识了Go语言,在了解了Go的一些特性之后决定系统的学习一番.我发现关于Go的学习资料并不多,以至于我需

Swift 新语言开发

全书目录: 一.Welcome to Swift 二.Language Guide 三.Language Reference /* 译者的废话: 几个小时前熬夜看了WWDC,各种激动,今年很有料啊!当看到Swift出来的时候,瞬间傻眼,又要学习新语言了.这篇文章来自苹果官方的<The Swift Programming Language>一书,500页左右,在苹果官网有下载.Swift大家都没实际用过,本翻译一定是有各种错漏的,各位多多包涵,我会不断更新修正的. --(博客园.新浪微博)葛布林

总结常见的ES6新语法特性。

前言 ES6是即将到来的新版本JavaScript语言的标准,他给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数(=>).class等等.用一句话来说就是: ES6给我们提供了许多的新语法和代码特性来提高javascript的体验 不过遗憾的是,现在还没有浏览器能够很好的支持es6语法,点这里查看浏览器支持情况,所以我们在开发中还需要用babel进行转换为CommonJS这种模块化标准的语法. 因为下面我会讲到一

新语言学习

用过的语言按时序算:c++.lua(粗浅脚本).erlang.c#(unity).lua.go.印象最深的是erlang,因为特别吃亏,嗯. 那会连多线程.多进程都不怎么了解,虽然看了erlang的进程通信模型,mail_box.gen_server原理,但不理解什么时候要它们.还有递归为主的编码方式,也不大习惯. …… 以上不是本是要说的重点:技术上的东西,时间够,多用用就熟络了,且项目组对新人也有足够的宽容度. 更紧要的是那些“安全性”上的东西,尤其对已发布的项目而言. 自己以往编码,把几乎