STL(一)之新语言特性

STL(一)之新语言特性C++标准库(一)之新语言特性新语言特性nullptr被解释为一个void*,不同于NULL被解释为一个int可以用auto在编译期完成自动推导,不会影响执行期的速度新的for循环方式:for(decl:coll){statement}rvaluereference也是一个r

大家好,欢迎来到IT知识分享网。STL(一)之新语言特性"

C++标准库(一)之新语言特性

新语言特性

  • 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://yundeesoft.com/34431.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信