C++ Boost PointerContainer智能指针详解

 更新时间:2022年11月17日 15:06:37   作者:无水先生  
智能指针是一种像指针的C++对象,但它能够在对象不使用的时候自己销毁掉。虽然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷贝和赋值操作),因此很少有人使用。它是Boost各组件中,应用最为广泛的一个

一、提要

在 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现宾果消消乐

    C语言实现宾果消消乐

    这篇文章主要为大家详细介绍了C语言实现宾果消消乐,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • 解析C++中std::ref的使用

    解析C++中std::ref的使用

    这篇文章主要介绍了解析C++中std::ref的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C语言编程深入理解取整取余取模问题示例分析

    C语言编程深入理解取整取余取模问题示例分析

    这篇文章主要为大家介绍了C语言编程深入理解取整取余取模问题的示例分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • Qt音视频开发之实现ffmpeg视频旋转显示

    Qt音视频开发之实现ffmpeg视频旋转显示

    这篇文章主要为大家详细介绍了在Qt音视频开发中如何利用ffmpeg实现视频旋转显示,文中的实现步骤讲讲清晰,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C语言实现BMP图像处理(彩色图转灰度图)

    C语言实现BMP图像处理(彩色图转灰度图)

    这篇文章主要为大家详细介绍了C语言实现BMP图像处理,彩色图转灰度图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Qt6安装教程(使用国内源)

    Qt6安装教程(使用国内源)

    本文主要介绍了Qt6安装教程(使用国内源),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C语言判断回文数的小例子

    C语言判断回文数的小例子

    这篇文章主要介绍了C语言判断回文数的小例子,有需要的朋友可以参考一下
    2014-01-01
  • C++实现LeetCode(109.将有序链表转为二叉搜索树)

    C++实现LeetCode(109.将有序链表转为二叉搜索树)

    这篇文章主要介绍了C++实现LeetCode(109.将有序链表转为二叉搜索树),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • c++项目构成从cmake使用基础详解

    c++项目构成从cmake使用基础详解

    这篇文章主要为大家介绍了c++项目构成,从cmake使用基础开始为大家讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • OpenCV实现马赛克和毛玻璃滤镜特效

    OpenCV实现马赛克和毛玻璃滤镜特效

    这篇文章主要为大家详细介绍了OpenCV实现马赛克和毛玻璃滤镜特效,具有一定的参考价值,感兴趣的小伙伴们可以参考一下方法
    2019-05-05

最新评论