格式化输出对象,可以不改变流输出状态实现类似于printf()的输出
头文件 #include <boost/format.hpp> using namespace boost; 简单的例子 //第一种用法 cout << format("%s:%d+%d=%d\n") %"sum" %1 %2 %(1+2); //第二种用法 format fmt("(%1% + %2%) * %2% = %3%\n"); fmt %2 %5; fmt %((2+5)*5); cout << fmt.str();运行结果:
sum:1+2=3 (2 + 5) * 5 = 35说明:
第一种用法使用了和printf类似的语法结构,不必赘述
第二种用法,先实例化format对象确定输出格式,使用%N%指示参数位置
format对象操作 //返回格式化后的字符串 formatobj.str(); //返回已格式化的字符串长度 formatobj.size(); //清空格式和内容 formatobj.parse(); //只清除格式 formatobj.clear(); 格式化规则%05d:输出宽度为5的整数,不足位用0填充
%-8.3f:输出左对齐,宽度总为8,小数位为3的浮点数
% 10s:输出10位的字符串,不足用空格填充
05X:输出宽度为5的大写16进制整数,不足填充0
%|spec|:将格式化选项包含进两个竖线之间,更好的区分格式化选项和普通字符
%N%:标记弟N个参数,相当于占位符,不带任何其他的格式化选项
format fmt1("%05d\t%-8.3f\t% 10s\t%05X\n"); cout << fmt1 %62 %2.236 %"123456789" %48; format fmt2("%|05d|\t%|-8.3f|\t%| 10s|\t%|05X|\n"); cout << fmt2 %62 %2.236 %"123456789" %48;执行结果:
00062 2.236 123456789 00030 00062 2.236 123456789 00030 lexical_cast 功能对字符串进行“字面值”的转换,对字符串与整数/浮点数之间进行转换
需要包含的头文件 #inlude <boost/lexical_cast.hpp> using namespace boost; 声明 //标准形式,转换数字和字符串 template <typename Target,typename Source> inline Target lexical_cast(const Source &arg); //转换C字符串 template <typename Target> inline Target lexical_cast(const char * chars,std::size_t count) 使用在模板参数里指定转换的目标类型即可
//string -> int int x = lexical_cast<int> ("100"); // string -> float float pai = lexical_cast<float> ("3.14159e5"); //int -> string string str = lexical_cast<string> (456); //float -> string string str = lexical_cast<string> (0.618); //hex -> string string str = lexical_cast<string> (0x10);【注意事项】
该模板智能转换字面值,如果出现不合理的转换,例如“hello”转int类型,则会报错(正常人应该不会这么干)
当lexical_cast无法执行转换操作时会抛出异常bad_lexical_cast,它是std::bad_cast的派生类
传统保护办法在使用lexical_cast时应该使用try_catch来保护代码
try { cout <<lexical_cast<int>("0x100"); } catch(bad_lexical_cast& e) { cout << "error: \n" << e.what() << endl; } //运行结果 error: bad lexical cast:source type value could not be interpreted as target 已有库的保护办法需要使用命名空间:boost::conversion
函数:
boost::conversion::try_lexical_cast(typeRaw,typeTarget);
返回值为bool表示是否转换成功
【技巧:验证数字字符串的合法性(用于验证用户输入的有效性)】实现一个模板类
template<typename T> bool num_valid(const char* str) { T tmp; return conversion::try_lexical_convert(str,tmp) //尝试转换数字 } //用法 assert(num_valid<double>("3.14")); assert(!num_valid<int>("3.14")); assert(num_valid<int>("65535")); 转换要求lexical_cast对转换对象有一定要求
转换的起点对象是可流输出的(可以用“<<”)
【注意事项】对于重载了“<<”操作符的自定义类型也可以使用它
转换的终点对象是可流输入的(可以用“>>”)
转换的终点对象是可默认构造的、可拷贝构造的
最常用的搭档:int,double,string等POD类型
C++标准转换函数 //字符串转换为数字 int stoi(const string& str,size_t *idx = 0,int base = 10); long stol(const string& str,size_t *idx = 0,int base = 10); long long stoll(const string& str,size_t *idx = 0,int base = 10); float stof(const string& str,size_t *idx = 0); double stod(const string& str,size_t *idx = 0); //数字转换为string string to_string(Type val);【注意事项】必须以空格或数字开头,否则报错
和lexical_cast的比较:
优点:
无需写模板参数
允许出现非数字字符(忽略起始空格,遇到无法转换的字符终止)
缺点:
不支持对自定义类型的转换
string_algo 功能提供了强大的字符串处理能力,如查找、访问、基本的字符串处理
头文件和命名空间 #include <boost/algorithm/string.hpp> using namespace boost; 用法【注意事项】不仅可以用在string上(在这里string被看作是vector<char>),也可以用于部分其他容器,例如(vector<T>)
大小写转换 string str("Hello"); //转向大写 cout << to_upper(str) << endl; //这种方式会改变源数据 cout << to_upper_copy(str) << endl; //这种方法返回一个转换后的拷贝对象 //转向小写 cout << to_lower(str) <<endl; cout << to_lower_copy(str) << endl; 判断式(算法)lexicographical_compare:根据字典顺序检测一个字符串是否小于另一个字符串
starts_with:检测字符串是否以另一个字符串为前缀
ends_with:检测字符串是否以另一个字符串为后缀
contains:检测字符串是否包含另一个字符串
equals:检测两个字符串是否相等
all:检测字符串是否满足指定的判断式
【注意事项】
除了all以外都有一个i前缀的版本,表示大小写无关
这些函数都不变动字符串