热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BOOST基础

BOOST基础1.简介2.安装3.使用3.1lamdba表达式3.2容器中存放任意类型值3.3数据转化3.4指针容器3.5退出处理3.6遍历BOOST_FOREACH3.7函数绑定

BOOST基础

  • 1. 简介
  • 2. 安装
  • 3. 使用
    • 3.1 lamdba表达式
    • 3.2 容器中存放任意类型值
    • 3.3 数据转化
    • 3.4指针容器
    • 3.5 退出处理
    • 3.6 遍历`BOOST_FOREACH`
    • 3.7 函数绑定
    • 3.8 不可复制类


1. 简介
  • C++的一个准标准库

2. 安装
  • 在线安装
    Redhat/Centos

sudo yum install boost-devel

Ubuntu

sudo apt-get install libboost-dev

  • 手动安装
    大部分boost库的头文件主要由模板和内联函数实现,不需要编译成二进制文件。只需要解压即可。

  1. 下载boost:http://www.boost.org/
  2. 解压tar -jxvf boost-版本号.tar.bz2

如果用到如下特性的时候需要安装。

Boost.Filesystem
Boost.IOStreams
Boost.ProgramOptions
Boost.Python
Boost.Regex
Boost.Serialization
Boost.Signals
Boost.Thread
Boost.Wave

全安装方式

  1. 编译./bootstrap.sh --prefix=$HOME/usr.

  2. 安装./b2 install
    库的生成路径:$HOME/usr/lib,头文件的路径:$HOME/usr/include/boost

  3. 添加lib库自动搜索路径
    vim /etc/ld.so.conf,添加include /usr/local/lib

  4. 运行ldconfig命令使之生效。


3. 使用

3.1 lamdba表达式

lambda库通过创建一个匿名的lambda表达式来代替实名的函数对象

  • HelloWorld.cpp

#include
#include
using namespace boost::lambda;
using namespace std;
int main() {(cout << _1 << " " << _2)("Hello","World");
}

#include
#include
using namespace boost::lambda;
using namespace std;int main(){ auto func &#61; std::cout << _1 << " " << _2;func("Hello","World");
}

  • for_each.cpp

#include
#include
#include
#include
#include
int main()
{ using namespace boost::lambda; using namespace std; int arr[] &#61; {1,2,3,4,5,6};for_each(arr,arr&#43;6, cout << _1 << " " );cout << endl;vector<int> vec(arr,arr&#43;6);for_each(vec.begin(),vec.end(), cout << _1 << " " );cout << endl;
}

如果需要使用_1_2的成员变量。需要使用绑定bind()

#include
#include
#include
#include
#include "boost/lambda/lambda.hpp"
#include "boost/lambda/bind.hpp" using namespace boost::lambda;
using namespace std;
int main() { map<int,string> kv;kv[110] &#61; "匪警";kv[119] &#61; "火警";kv[120] &#61; "急救中心";for_each(kv.begin(),kv.end(), cout << bind(&map<int,string>::value_type::first,_1) << &#39;\t&#39; << bind(&map<int,string>::value_type::second,_1) << &#39;\n&#39;);
}

3.2 容器中存放任意类型值

#include
#include
#include
#include
#include int main(){using namespace std;using namespace boost;any a1 &#61; 10;any a2 &#61; 1.1f;any a3 &#61; string("abc");any a4 &#61; "abcefg";cout << any_cast<int>(a1) << endl;cout << any_cast<float>(a2) << endl;cout << any_cast<string&>(a3) << endl;cout << any_cast<const char*>(a4) << endl;vector<any> vec2 &#61; {"abcd",123,3.14};cout << any_cast<const char*>(vec2[0]) << endl;cout << any_cast<int>(vec2[1]) << endl;cout << any_cast<double>(vec2[2]) << endl;vector<any> vec;vec.push_back(10);vec.push_back(12.4);vec.push_back(string("string"));char const* c_str &#61; "const char*";vec.push_back(c_str);cout << any_cast<int>(vec[0]) << endl<< any_cast<double>(vec[1]) << endl<< any_cast<string&>(vec[2]) << endl<< any_cast<char const*>(vec[3]) << endl;// copy(vec.begin(),vec.end(),ostream_iterator(cout,","));
}

注意&#xff1a;

  1. any_cast<>中的类型不是原来的类型会抛出异常。
  2. any已经成为C&#43;&#43;17的标准库组件。

3.3 数据转化


  • 字符串转数字

#include
#include
int main(){int i &#61; boost::lexical_cast<int>("100");float f &#61; boost::lexical_cast<float>("2.01");char chars[] &#61; "1234";int n &#61; boost::lexical_cast<int>(chars,strlen(chars));std::cout << i << " " << f << " " << n << std::endl;// f &#61; boost::lexical_cast("2.01"); // 类型不匹配抛异常
}

C&#43;&#43;11可以使用stoi()stof()


  • 数字转字符串

#include
#include
#include
int main(){std::string str1 &#61; boost::lexical_cast<std::string>(100);std::string str2 &#61; boost::lexical_cast<std::string>(2.01);std::cout << str1 << " " << str2 << std::endl;
}

  • 多态对象转换

#include
#include
using namespace std;
class Base{
public:void Func(){cout << "Base" << endl;}virtual ~Base(){}
};
class Derive : public Base{
public:void Func(){cout << "Derive" << endl;}
};
int main(){Base* b &#61; new Derive;boost::polymorphic_cast<Derive*>(b)->Func();
}

3.4指针容器

特点&#xff1a;容器销毁自动释放指针
在这里插入图片描述

#include
#include int main(){ptr_vector<int> pvec;for(int i&#61;0;i<10;&#43;&#43;i){pvec.push_back(new int(i));}for(auto n:pvec){cout << n << " ";}boost::ptr_set<int> s;for(size_t i&#61;0;i<10;i&#43;&#43;){s.insert(new int(i));}
}

3.5 退出处理

变量离开(正常/异常)作用域&#xff0c;触发处理代码

#include
#include
using namespace std;
int main(){{int *a &#61; new int(10);BOOST_SCOPE_EXIT(a){delete a;}BOOST_SCOPE_EXIT_ENDcout << *a << endl;}
}

不止用在new/delete&#xff0c;也用在fopen()/fclose()&#xff0c;dlopen()/dlclose()等。与析构函数相似的作用。

3.6 遍历BOOST_FOREACH

#include
#include
using namespace std;
int main(){int arr[] &#61; {1,2,3,4,5};BOOST_FOREACH(int a,arr) cout << a << endl;
}

3.7 函数绑定


  • 全局函数&#xff1a;boost::bind(函数名, 参数1&#xff0c;参数2&#xff0c;...)
  • 成员函数&#xff1a;boost::bind(&类名::方法名&#xff0c;类实例指针&#xff0c;参数1&#xff0c;参数2&#xff09;

#include
#include
#include
using namespace std;
bool comp(int a,int b){return a<b;
}
int main(){int arr[] &#61; {1,2,3,4,5};cout << count_if(arr,arr&#43;5,boost::bind(comp,_1,3)) << endl;cout << count_if(arr,arr&#43;5,boost::bind(comp,2,_1)) << endl;
}

bind支持最多九个参数。占位符被命名为 _1,_2, _3, _4, 直至 _9


3.8 不可复制类

#include class Test:private boost::nocopyable{// ...
};


推荐阅读
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • Python内置模块详解:正则表达式re模块的应用与解析
    正则表达式是一种强大的文本处理工具,通过特定的字符序列来定义搜索模式。本文详细介绍了Python内置的`re`模块,探讨了其在字符串匹配、验证和提取中的应用。例如,可以通过正则表达式验证电子邮件地址、电话号码、QQ号、密码、URL和IP地址等。此外,文章还深入解析了`re`模块的各种函数和方法,提供了丰富的示例代码,帮助读者更好地理解和使用这一工具。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • Python正则表达式详解:掌握数量词用法轻松上手
    Python正则表达式详解:掌握数量词用法轻松上手 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 在Python中,是否可以通过使用Tkinter或ttk库创建一个具有自动换行功能的多行标签,并使其宽度能够随着父容器的变化而动态调整?例如,在调整NotePad窗口宽度时,实现类似记事本的自动换行效果。这种功能在设计需要显示长文本的对话框时非常有用,确保文本内容能够完整且美观地展示。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 技术日志:Ansible的安装及模块管理详解 ... [详细]
  • 在项目开发过程中,掌握一些关键的Linux命令至关重要。例如,使用 `Ctrl+C` 可以立即终止当前正在执行的命令;通过 `ps -ef | grep ias` 可以查看特定服务的进程信息,包括进程ID(PID)和JVM参数(如内存分配和远程连接端口);而 `netstat -apn | more` 则用于显示网络连接状态,帮助开发者监控和调试网络服务。这些命令不仅提高了开发效率,还能有效解决运行时的各种问题。 ... [详细]
  • 基于域名、端口和IP的虚拟主机构建方案
    本文探讨了在单台物理服务器上构建多个Web站点的虚拟主机方案,详细介绍了三种主要的虚拟主机类型:基于域名、基于IP地址和基于端口的虚拟主机。每种类型的实现方式及其优缺点均进行了深入分析,为实际应用提供了全面的技术指导。 ... [详细]
  • 深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用
    深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用 ... [详细]
  • 在Linux环境下编译安装Heartbeat时,常遇到依赖库缺失的问题。为确保顺利安装,建议预先通过yum安装必要的开发库,如glib2-devel、libtool-ltdl-devel、net-snmp-devel、bzip2-devel和ncurses-devel等。这些库是编译过程中不可或缺的组件,能够有效避免编译错误,确保Heartbeat的稳定运行。 ... [详细]
  • 深入解析Spring框架中的双亲委派机制突破方法
    在探讨Spring框架中突破双亲委派机制的方法之前,首先需要了解类加载器的基本概念。类加载器负责将类的全限定名转换为对应的二进制字节流。每个类在被特定的类加载器加载后,其唯一性得到保证。然而,这种机制在某些场景下可能会限制灵活性,因此Spring框架提供了一些策略来突破这一限制,以实现更加动态和灵活的类加载。这些策略不仅能够提升系统的可扩展性,还能在复杂的运行环境中确保类的正确加载和管理。 ... [详细]
  • 无法将文件下载到AWSLambda ... [详细]
  • 数据科学笔记26:深入解析随机森林分类算法及其在Python和R中的应用
    ### 摘要随机森林是一种在集成学习领域备受推崇的算法,被誉为“集成学习技术的典范”。该方法因其简洁性、易实现性和较低的计算成本而被广泛应用。本文将深入探讨随机森林的工作原理,特别是其在Python和R中的具体应用。随机森林通过结合多个决策树和Bagging技术,有效提高了模型的准确性和鲁棒性。我们将详细解析其核心机制,并通过实际案例展示如何在不同编程环境中高效实现这一强大的分类算法。 ... [详细]
author-avatar
mobiledu2502861597
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有