C++ Boost PointerContainer智能指针详解

目录
  • 一、提要
  • 二、智能指针Boost.PointerContainer
  • 三、练习

一、提要

在 C++11 中,Boost.PointerContainer是另一个智能指针,一般是用来生成集合数据的,本文阐述这种指针的特点和用法。

二、智能指针Boost.PointerContainer

库 Boost.PointerContainer 提供专门用于管理动态分配对象的容器。例如,在 C++11 中,您可以使用 std::vector<std::unique_ptr<int>> 创建这样的容器。但是,来自 Boost.PointerContainer 的容器可以提供一些额外的便利。

Example2.1.Usingboost::ptr_vector

#include <boost/ptr_container/ptr_vector.hpp>
#include <iostream>
int main()
{
  boost::ptr_vector<int> v;
  v.push_back(new int{1});
  v.push_back(new int{2});
  std::cout << v.back() << '\n';
}

类 boost::ptr_vector 基本上像 std::vector<std::unique_ptr<int>> 一样工作(参见示例 2.1)。但是,因为 boost::ptr_vector 知道它存储动态分配的对象,所以像 back() 这样的成员函数会返回对动态分配对象的引用,而不是指针。因此,该示例将 2 写入标准输出。

例子1.boost::ptr_set以直观正确的顺序

#include <boost/ptr_container/ptr_set.hpp>
#include <boost/ptr_container/indirect_fun.hpp>
#include <set>
#include <memory>
#include <functional>
#include <iostream>
int main()
{
  boost::ptr_set<int> s;
  s.insert(new int{2});
  s.insert(new int{1});
  std::cout << *s.begin() << '\n';
  std::set<std::unique_ptr<int>, boost::indirect_fun<std::less<int>>> v;
  v.insert(std::unique_ptr<int>(new int{2}));
  v.insert(std::unique_ptr<int>(new int{1}));
  std::cout << **v.begin() << '\n';
}

示例 1 说明了使用专用容器的另一个原因。该示例将 int 类型的动态分配变量存储在 boost::ptr_set 和 std::set 中。 std::set 与 std::unique_ptr 一起使用。

使用 boost::ptr_set,元素的顺序取决于 int 值。 std::set 比较 std::unique_ptr 类型的指针,而不是指针引用的变量。要使 std::set 根据 int 值对元素进行排序,必须告知容器如何比较元素。在示例 1 中,使用了 boost::indirect_fun(由 Boost.PointerContainer 提供)。使用 boost::indirect_fun,std::set 被告知不应该根据 std::unique_ptr 类型的指针对元素进行排序,而是根据指针所指的 int 值。这就是示例显示 1 两次的原因。

除了 boost::ptr_vector 和 boost::ptr_set 之外,还有其他容器可用于管理动态分配的对象。这些附加容器的示例包括 boost::ptr_deque、boost::ptr_list、boost::ptr_map、boost::ptr_unordered_set 和 boost::ptr_unordered_map。这些容器对应于标准库中众所周知的容器。

例子2 .来自 Boost.PointerContainer 的容器插入器

#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/ptr_container/ptr_inserter.hpp>
#include <array>
#include <algorithm>
#include <iostream>
int main()
{
  boost::ptr_vector<int> v;
  std::array<int, 3> a{{0, 1, 2}};
  std::copy(a.begin(), a.end(), boost::ptr_container::ptr_back_inserter(v));
  std::cout << v.size() << '\n';
}

Boost.PointerContainer 为其容器提供插入器。它们在命名空间 boost::ptr_container 中定义。要访问插入器,您必须包含头文件 boost/ptr_container/ptr_inserter.hpp。

示例 2 使用函数 boost::ptr_container::ptr_back_inserter(),它创建了一个 boost::ptr_container::ptr_back_insert_iterator 类型的插入器。此插入器被传递给 std::copy() 以将数组 a 中的所有数字复制到向量 v。因为 v 是 boost::ptr_vector 类型的容器,它需要动态分配的 int 对象的地址,所以插入器使用堆上的新地址并将地址添加到容器中。

除了 boost::ptr_container::ptr_back_inserter() 之外,Boost.PointerContainer 还提供了 boost::ptr_container::ptr_front_inserter() 和 boost::ptr_container::ptr_inserter() 函数来创建相应的插入器。

三、练习

使用成员变量 name、legs 和 has_tail 创建一个包含多个动物类型对象的程序。将对象存储在 Boost.PointerContainer 的容器中。根据腿按升序对容器进行排序,并将所有元素写入标准输出。

到此这篇关于C++ Boost PointerContainer智能指针详解的文章就介绍到这了,更多相关C++ Boost PointerContainer内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ Boost Lockfree超详细讲解使用方法

    目录 一.说明 二.示例和代码 Boost.Lockfree 一.说明 Boost.Lockfree 提供线程安全和无锁容器.可以从多个线程访问此库中的容器,而无需同步访问. 在 1.56.0 版本中,Boost.Lockfree 只提供了两个容器:boost::lockfree::queue 类型的队列和 boost::lockfree::stack 类型的栈.对于队列,可以使用第二个实现:boost::lockfree::spsc_queue.此类针对只有一个线程写入队列和只有一个线程从队列

  • C++ Boost Thread线程使用示例详解

    目录 一.并行编程 二.生成何管理Threads 练习 一.并行编程 以下库支持并行编程模型. Boost.Thread 允许您创建和管理自己的线程. Boost.Atomic 允许您通过多个线程的原子操作访问整数类型的变量. Boost.Lockfree 提供线程安全的容器. Boost.MPI 起源于超级计算机领域.使用 Boost.MPI,您的程序可以多次启动并在多个进程中执行.您专注于对应该并发执行的实际任务进行编程,而 Boost.MPI 会协调这些过程.使用 Boost.MPI,您无

  • C++ Boost MPI接口详细讲解

    目录 一.说明 二.开发和运行时环境 三.简单数据交换 一.说明 Boost.MPI 提供了 MPI 标准(消息传递接口)的接口.该标准简化了并发执行任务的程序的开发.您可以使用线程或通过共享内存或网络连接使多个进程相互通信来开发此类程序. MPI 的优点是你不需要关心这些细节.您可以完全专注于并行化您的程序. 缺点是您需要 MPI 运行时环境.如果您控制运行时环境,MPI 只是一个选项.例如,如果你想分发一个可以通过双击启动的程序,你将无法使用 MPI.虽然操作系统开箱即用地支持线程.共享内存

  • C++ Boost EnableIf函数使用介绍

    目录 一.说明 二.Boost.EnableIf的示例 练习 一.说明 Boost.EnableIf Boost.Enable If 可以禁用重载函数模板或专用类模板.禁用意味着编译器忽略相应的模板.这有助于防止出现模棱两可的情况,即编译器不知道要使用哪个重载函数模板.它还可以更轻松地定义不仅可用于特定类型而且可用于一组类型的模板. 从 C++11 开始,Boost.EnableIf 已经成为标准库的一部分.您可以在不使用 Boost 库的情况下调用本章介绍的函数:只需包含头文件 type_tr

  • C++ Boost shared_ptr共享指针详细讲解

    目录 一.提要 二.智能指针boost::shared_ptr与boost::scoped_ptr 三.智能指针 boost::shared_ptr用法 示例1 示例2 示例3 示例4 示例5 一.提要 boost::shared_ptr是另一个智能指针,与 boost::scoped_ptr有很大不同,本文阐述这种区别. 二.智能指针boost::shared_ptr与boost::scoped_ptr 主要区别在于: boost::shared_ptr 不一定是对象的独占所有者. 所有权可以

  • C++ boost scoped_ptr智能指针详解

    目录 一.智能指针-唯一所有者 二.接口类分析 一.智能指针-唯一所有者 boost::scoped_ptr 是一个智能指针,它是动态分配对象的唯一所有者. boost::scoped_ptr 无法复制或移动.此智能指针在头文件 boost/scoped_ptr.hpp 中定义. 二.接口类分析 scoped_array 分析 scoped_array 的类部分原始代码如下: template<class T> class scoped_array // noncopyable { priva

  • C++ Boost Atomic详细讲解

    目录 一.说明 二.示例和代码 一.说明 Boost.Atomic 提供类 boost::atomic,可用于创建原子变量.它们被称为原子变量,因为所有访问都是原子的. Boost.Atomic 用于多线程程序,当在一个线程中访问变量不应被访问相同变量的另一个线程中断时.如果没有 boost::atomic,从多个线程访问共享变量的尝试将需要与锁同步. boost::atomic 取决于支持原子变量访问的目标平台.否则,boost::atomic 使用锁.该库允许您检测目标平台是否支持原子变量访

  • C++ Boost Lambda表达式详解

    目录 lambda表达式格式 说明Boost.Lambda lambda表达式格式 lambda表达式的格式 [捕捉列表](参数列表)mutable->返回值类型{ 语句部分 }; 其中参数列表.返回值类型是可选的,捕捉列表.函数体可以为空. 先来看一个较为简单的lamda表达式 int main(void) { auto add = [](int a, int b)->int {return a + b; }; cout << add(1, 2) << endl; r

  • C++ Boost PointerContainer智能指针详解

    目录 一.提要 二.智能指针Boost.PointerContainer 三.练习 一.提要 在 C++11 中,Boost.PointerContainer是另一个智能指针,一般是用来生成集合数据的,本文阐述这种指针的特点和用法. 二.智能指针Boost.PointerContainer 库 Boost.PointerContainer 提供专门用于管理动态分配对象的容器.例如,在 C++11 中,您可以使用 std::vector<std::unique_ptr<int>> 创

  • C++智能指针详解

    目录 一. unique_ptr独占指针 特点 创建方式 传递方式 简单使用 隐藏危险 二. shared_ptr 计数指针 特点 传递方式 隐藏危险 三. weak_ptr 优缺点: 智能指针由原始指针的封装,优点是可以自动分配内存,不用担心内存泄漏问题. 用于解决独占/共享所有权指针的释放,传输等问题. 但是没有原始指针方便. 一. unique_ptr独占指针 特点 都是围绕独占展开 特点一: 如其名,独占.也就是说同一个内存空间同时只能有一个指针来管理. int* pi = new in

  • C++学习之移动语义与智能指针详解

    移动语义 1.几个基本概念的理解 (1)可以取地址的是左值,不能取地址的就是右值,右值可能存在寄存器,也可能存在于栈上(短暂存在栈)上 (2)右值包括:临时对象.匿名对象.字面值常量 (3)const 左值引用可以绑定到左值与右值上面,称为万能引用.正因如此,也就无法区分传进来的参数是左值还是右值. const int &ref = a;//const左值引用可以绑定到左值 const int &ref1 = 10;//const左值引用可以绑定到右值 (4)右值引用:只能绑定到右值不能绑

  • 一篇文章带你了解C++智能指针详解

    目录 为什么要有智能指针? 智能指针的使用及原理 RALL shared_ptr的使用注意事项 创建 多个 shared_ptr 不能拥有同一个对象 shared_ptr 的销毁 shared_ptr 的线程安全问题 shared_ptr 的循环引用 unique_ptr的使用 unique_ptr 总结 为什么要有智能指针? 因为普通的指针存在以下几个问题: 资源泄露 野指针 未初始化 多个指针指向同一块内存,某个指针将内存释放,别的指针不知道 异常安全问题 如果在 malloc和free 或

  • C++Smart Pointer 智能指针详解

    目录 一.为啥使用智能指针呢 二.shared_ptr智能指针 三.unique_ptr智能指针 四.weak_ptr智能指针 五.智能指针怎么解决交叉引用,造成的内存泄漏 5.1交叉引用的栗子: 5.2解决方案 六.智能指针的注意事项 总结 一.为啥使用智能指针呢 标准库中的智能指针: std::auto_ptr --single ownership (C++98中出现,缺陷较多,被摒弃) std::unique_ptr --single ownership (C++11替代std::auto

  • C++ Boost TypeTraits库使用详解

    目录 一.说明 二.库Boost.TypeTraits 一.说明 反省是重点中的重点,泛型在实践中贯穿工程的始终.以下库支持泛型编程.无需详细了解模板元编程即可使用这些库. Boost.TypeTraits 提供了检查类型属性的函数. Boost.EnableIf 可以与 Boost.TypeTraits 一起使用,例如,根据函数的返回类型重载函数. Boost.Fusion 使创建异构容器成为可能——其元素可以具有不同类型的容器. Boost.TypeTraits Boost.EnableIf

  • C语言指针详解及用法示例

    新手在C语言的学习过程中遇到的最头疼的知识点应该就是指针了,指针在C语言中有非常大的用处.下面我就带着问题来写下我对于指针的一些理解. 指针是什么? 指针本身是一个变量,它存储的是数据在内存中的地址而不是数据本身的值.它的定义如下: int a=10,*p; p=&a int a=10; int *p=&a; 首先我们可以理解 int* 这个是要定义一个指针p,然后因为这个指针存储的是地址所以要对a取地址(&)将值赋给指针p,也就是说这个指针p指向a. 很多新手都会对这两种定义方法

  • C++ 中boost::share_ptr智能指针的使用方法

    C++ 中boost::share_ptr智能指针的使用方法 最近项目中使用boost库的智能指针,感觉智能指针还是蛮强大的,在此贴出自己学习过程中编写的测试代码,以供其他想了解boost智能指针的朋友参考,有讲得不正确之处欢迎指出讨论.当然,使用boost智能指针首先要编译boost库,具体方法可以网上查询,在此不再赘述. 智能指针能够使C++的开发简单化,主要是它能够自动管理内存的释放,而且能够做更多的事情,即使用智能指针,则可以再代码中new了之后不用delete,智能指针自己会帮助你管理

  • C++中函数指针详解及代码分享

    函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,如同数组的名字就是数组的起始地址. 1.函数指针的定义方式:data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn); c语言函数指针的定义形式:返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,-); c++函数指针的定义形式:返回类型 (类名

随机推荐