学习
实践
活动
专区
工具
TVP
写文章
  • 广告
    关闭

    2023新春采购节

    领8888元新春采购礼包,抢爆款2核2G云服务器95元/年起,个人开发者加享折上折

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++设计模式 - 迭代器模式

    C++ STL中各个容器都有迭代器的体现,通过迭代器能够顺序的访问该容器各成员。 意义 有利于隐藏聚合类的内部实现,外部通过迭代器来实现对聚合类的顺序访问。 场景 实现聚合类的一种顺序访问。 源码实现 「编程环境」 编译环境: Linux环境 语言: C++语言 编译命令: make 「工程结构」 Iterator/ ├── aggregatebase.h ├── aggregate.h ├ (1); agg->push_back(2); agg->push_back(13); for (it.First(); it.IsEnd(); it.Next()) (1.2); agg->push_back(2); agg->push_back(13); for (it.First(); it.IsEnd(); it.Next()) 在C++ STL库中已经提供迭代器的实现。本文的实现主要是了解迭代器的大致原理。 最后 用心感悟,认真记录,写好每一篇文章,分享每一框干货。

    11420

    C++(STL):19---deque之删除和emplace用法

    成员函数 功能 push_back() 在容器现有元素的尾部添加一个元素,和 emplace_back() 不同,该函数添加新元素的过程是,先构造元素,然后再将该元素移动或复制到容器的尾部。 emplace_back() C++ 11 新添加的成员函数,其功能是在容器尾部生成一个元素。和 push_back() 不同,该函数直接在容器头部构造元素,省去了复制或移动元素的过程。 emplace_front() C++ 11 新添加的成员函数,其功能是在容器头部生成一个元素。和 push_front() 不同,该函数直接在容器头部构造元素,省去了复制或移动元素的过程。 emplace() C++ 11 新添加的成员函数,其功能是 insert() 相同,即在指定的位置直接生成一个元素。 在实际应用中,常用 emplace()、emplace_front() 和 emplace_back() 分别代替 insert()、push_front() 和 push_back(),具体原因本节后续会讲

    70940

    从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr、实现Ptr_vector

    比如说int,C++中的内置类型都是值语义,前面学过的三个标准库类型string,vector,map也是值语义 2、对象语义指的是面向对象意义下的对象 对象拷贝是禁止的(Noncopyable) 的时候就出错了,查看push_back 的声明: void push_back(const _Ty& _Val); 即参数是const 引用,在函数内部拷贝时不能对右操作数进行更改,与第3点冲突,所以编译出错 考虑这样一种情形: vec.push_back(node.release()); 当node.release() 调用完毕,进而调用push_back 时,由这里知道,push_back 会先调用operater push_back(val); 成功(operator new 成功),那么局部智能指针对象释放裸指针的所有权;如果 std::vector<T *>::push_back(val); 失败(operator 参考: C++ primer 第四版 Effective C++ 3rd C++编程规范

    19310

    从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr、实现Ptr_vector

    比如说int,C++中的内置类型都是值语义,前面学过的三个标准库类型string,vector,map也是值语义 2、对象语义指的是面向对象意义下的对象 对象拷贝是禁止的(Noncopyable) 的时候就出错了,查看push_back 的声明: void push_back(const _Ty& _Val); 即参数是const 引用,在函数内部拷贝时不能对右操作数进行更改,与第3点冲突, 考虑这样一种情形: vec.push_back(node.release()); 当node.release() 调用完毕,进而调用push_back 时,由这里知道,push_back 会先调用operater _ Ptr_vector 继承自vector 类,重新实现push_back 函数,插入裸指针时,先用局部智能指针对象接管裸指针所有权,如果 std::vector<T *>::push_back(val 参考: C++ primer 第四版 Effective C++ 3rd C++编程规范

    1.1K00

    从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)

    下面是模仿VC6.0 中vector 的实现写的Vec 类,程序主要参考《Accelerated C++》 ,略有修改,比如将接口修改成与VC6.0 一致, 这样做的好处是可以传递第二个参数,也就是说可以自己决定内存的分配管理方式 第三次调用push_back,也一样分配三块内存,将t1, t2 拷贝下来,然后分别析构,最后将t3 拷贝上去。 输出的次数是一致的,只是拷贝的顺序有所不同而已,比如第二次调用push_back 的时候,VC2008 中的vector 是先拷贝t2, 接着拷 贝t1, 然后将t1 释放掉。 从上面的分析也可以看出,当push_back 的时候往往带有拷贝和析构多个操作,所以一下子分配比size() 大的空间capacity,可以减轻频繁操作造成的 效率问题。 参考: C++ primer 第四版 Effective C++ 3rd C++编程规范 Accelerated C++

    69100

    C++代码简化之道

    emplace方便之处在于,可以用函数参数自动构造对象,而不是向vector的push_back,map的insert那样传入一个构造好的对象。 举个例子,比如有这么一个对象。 vp.push_back(p); vp.emplace_back(p); 这种情况下,两种写法的表现几乎无差别(push_back反而短……当然可能也没必要追求这个)。 但此时push_back其实除了代码冗长外,其性能开销也没有比emplace_back高太多,因为 vp.push_back(Pointer(3, 4)); 调用的是: void push_back OK,C++也可以写类似的代码。然而C++用异常隐患很多,不如Java安全,很多工程规范都竭力避免抛异常。 某些情况下用struct替代class,避免把C++类写成JavaBean 因为种种原因,从Java转C++的程序员,喜欢把C++的类写成JavaBean。

    34820

    从零开始学C++之STL(二):实现简单容器模

    ************************************************** 下面是模仿VC6.0 中vector 的实现写的Vec 类,程序主要参考《Accelerated C+ 第三次调用push_back,也一样分配三块内存,将t1, t2 拷贝下来,然后分别析构,最后将t3 拷贝上去。 输出的次数是一致的,只是拷贝的顺序有所不同而已,比如第二次调用push_back 的时候,VC2008 中的vector 是先拷贝t2, 接着拷 贝t1, 然后将t1 释放掉。 从上面的分析也可以看出,当push_back 的时候往往带有拷贝和析构多个操作,所以一下子分配比size() 大的空间capacity,可以减轻频繁操作造成的 效率问题。 参考: C++ primer 第四版 Effective C++ 3rd C++编程规范 Accelerated C++

    45840

    吃透这些内容,c++ 不再难学

    学习 c++ 的过程就比较 “痛苦”:我断断续续,花了6个月时间,才从头到尾把英文版的 《C++ Primer》看了一遍。整个心路历程很复杂。 、模板函数,编译生成对应类、函数的代码 所以在运行性能上,c++ 的模板性能要高于 java;在编译代码结果上,c++ 泛型编译出来的代码量要远大于 java。 容器类都实现了右值引用的 move insert 操作,比如 vector::push_back 实现的有 push_back(value_type&&) 版本: void push_back(value_type && __x) { emplace_back(std::move(__x)); } 当我们的值是右值时,push_back 会调用 move construct 来提升性能。 总结 以上是我对于 c++ 语言上的几处难点的总结。 c++ 的难也绝不仅仅是上述那么几点。

    53830

    从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)

    比如说int,C++中的内置类型都是值语义,前面学过的三个标准库类型string,vector,map也是值语义 2、对象语义指的是面向对象意义下的对象 对象拷贝是禁止的(Noncopyable) 的时候就出错了,查看push_back 的声明: void push_back(const _Ty& _Val); 即参数是const 引用,在函数内部拷贝时不能对右操作数进行更改,与第3点冲突,所以编译出错 考虑这样一种情形: vec.push_back(node.release()); 当node.release() 调用完毕,进而调用push_back 时,由这里知道,push_back 会先调用operater _ Ptr_vector 继承自vector 类,重新实现push_back 函数,插入裸指针时,先用局部智能指针对象接管裸指针所有权,如果 std::vector<T *>::push_back(val 参考: C++ primer 第四版 Effective C++ 3rd C++编程规范

    71320

    扫码关注腾讯云开发者

    领取腾讯云代金券