boost的安装
在线安装
Redhat/Centos :
sudo yum install boost-devel
Ubuntu :
sudo apt-get install libboost-dev
手动安装
大部分boost库的头文件主要由模板和内联函数实现,不需要编译成二进制文件。只需要解压即可。
-
下载boost :
http://www.boost.org/
-
解压 :
tar -jxvf boost-版本号.tar.bz2
boost的使用
1. lamdba表达式
打印数字和字符
#include <iostream>
#include <boost/lambda/lambda.hpp>
using namespace std; // 标准库
using namespace boost::lambda; // boost lambda库
int main(){
// (cout << _1 << " " << _2)(3,4);
auto func = (cout << _1 << " " << _2);
func(1,"abcd");
}
结果为:
1 abcd
2. 容器中存放任意类型值
可以把任意类型的数据放在any中,用的时候再any_cast出类型
#include <iostream>
#include <boost/any.hpp>
using namespace std; // 标准库
using namespace boost; // boost库
int main(){
any n = 10;
any f = 1.23f;
any s = string("abcd");
cout << any_cast<int>(n) << endl;
cout << any_cast<float>(f) << endl;
cout << any_cast<string&>(s) << endl;
}
结果为:
10
1.23
abcd
3. 数据类型转换
字符串转整型或浮点型
#include <iostream>
#include <boost/lexical_cast.hpp>
using namespace std; // 标准库
using namespace boost; // boost库
int main(){
cout << lexical_cast<int>("1000") << endl;
cout << lexical_cast<float>("1.23000") << endl;
cout << stoi("1000") << endl; // C++11标准库
cout << stof("1.23") << endl;
}
结果为:
1000
1.23
1000
1.23
==字符串转换为类的类型 ==
#include <iostream>
#include <boost/lexical_cast.hpp>
using namespace std;
using namespace boost;
class People{
string name;
long telephone;
string address;
public:
friend ostream& operator << (ostream& os,const People& p){
return os << p.name << "\t" << p.telephone << "\t" << p.address;
}
friend istream& operator >> (istream& is,People& p){
return is >> p.name >> p.telephone >> p.address;
}
};
int main(){
People p; // = lexical_cast<People>("zhangsan 12345 abcde");
istringstream iss("zhangsan 12345 abcde");
iss >> p;
cout << p << endl;
}
结果为:
zhangsan 12345 abcde
4. 指针容器
特点
:容器销毁自动释放指针
类型 | 说明 |
---|---|
ptr_vector | 指针向量 |
ptr_set | 指针集合 |
ptr_array | 指针数组 |
ptr_multimap | 指针一对多映射 |
#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/ptr_container/ptr_set.hpp>
int main(){
ptr_vector<int> pvec;
for(int i=0;i<10;++i){
pvec.push_back(new int(i));
}
for(auto n:pvec){
cout << n << " ";
}
boost::ptr_set<int> s;
for(size_t i=0;i<10;i++){
s.insert(new int(i));
}
}
5. 退出处理
变量离开(正常/异常)作用域,再触发处理代码
#include <iostream>
#include <boost/scope_exit.hpp>
using namespace std;
using namespace boost;
class Test{
public:
Test(){cout << __func__ << endl;}
~Test(){cout << __func__ << endl;}
};
int main(){
Test t;
Test* pt = new Test;
BOOST_SCOPE_EXIT(pt){
delete pt; // 离开作用域实行
}BOOST_SCOPE_EXIT_END
cout << "abcd" << endl;
}
结果为:
Test
Test
abcd
~Test
~Test
不止用在new/delete,也用在fopen()/fclose(),dlopen()/dlclose()等
与析构函数相似的作用
6. 遍历
#include <iostream>
#include <boost/foreach.hpp>
using namespace std;
int main(){
int arr[] = {1,2,3,4,5};
BOOST_FOREACH(int a,arr) cout << a << endl;
}
7. 函数绑定
全局函数:
boost::bind(函数名, 参数1,参数2,...)
把参数中的一个函数参数固定,其他的再赋值
#include <iostream>
#include <boost/bind.hpp>
using namespace std;
using namespace boost;
int add(int a,int b,int c){
return a+b+c;
}
int main(){
auto add2 = bind(add,_1,_2,0);
cout << add2(10,12) << endl;
}
结果为:
22
成员函数:
boost::bind(&类名::方法名,类实例指针,参数1,参数2)
#include <iostream>
#include <boost/bind.hpp>
using namespace std;
using namespace boost;
class Test{
public:
Test(){cout << __func__ << endl;}
~Test(){cout << __func__ << endl;}
void Func(int n)const{
cout << n << endl;
}
};
int main(){
Test t;
t.Func(1000);
auto funct = bind(&Test::Func,&t,_1);
funct(2000);
}
结果为:
Test
1000
2000
~Test
8. 不可复制类
用boost库可以让类不可复制
#include <boost/nocopyable.hpp>
class Test:private boost::nocopyable{
// ...
};
在C++中 ,哪些方法可以禁止复制和重载?
- 设为私有
- 加=delete
class Test{
public:
Test(){cout << __func__ << endl;}
~Test(){cout << __func__ << endl;}
void Func(int n)const{
cout << n << endl;
}
// C++11
// Test(const Test&) = delete,
// Test& operator = (const Test&) = delete;
private:
Test(const Test&);
Test& operator = (const Test&);
};
版权声明:本文为weixin_39398433原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。