C++ Boost實現(xiàn)數(shù)字與字符串轉(zhuǎn)化詳解
一、引言
在boost庫中,有一個函數(shù)Boost.LexicalCast可以將數(shù)字和字符串進行雙向轉(zhuǎn)換。本文介紹這種用法的案例。
二、Boost.LexicalCast
Boost.LexicalCast 提供了一個轉(zhuǎn)換運算符,boost::lexical_cast,它可以將數(shù)字從字符串轉(zhuǎn)換為數(shù)字類型,例如 int 或 double ,反之亦然。 boost::lexical_cast 是 std::stoi()、std::stod() 和 std::to_string() 等函數(shù)的替代方案,這些函數(shù)已添加到 C++11 的標準庫中。
2.1 示例1
使用boost::lexical_cast
#include <boost/lexical_cast.hpp>
#include <string>
#include <iostream>
int main()
{
std::string s = boost::lexical_cast<std::string>(123);
std::cout << s << '\n';
double d = boost::lexical_cast<double>(s);
std::cout << d << '\n';
}轉(zhuǎn)換運算符 boost::lexical_cast 可以轉(zhuǎn)換不同類型的數(shù)字。示例 6.1 首先將整數(shù) 123 轉(zhuǎn)換為字符串,然后將字符串轉(zhuǎn)換為浮點數(shù)。要使用 boost::lexical_cast,請包含頭文件 boost/lexical_cast.hpp。
boost::lexical_cast 在內(nèi)部使用流來執(zhí)行轉(zhuǎn)換。因此,只能轉(zhuǎn)換具有重載運算符<< 和運算符>> 的類型。但是,可以針對某些類型優(yōu)化 boost::lexical_cast 以實現(xiàn)更有效的轉(zhuǎn)換。
2.2 示例2
boost::bad_lexical_cast當出錯時
#include <boost/lexical_cast.hpp>
#include <string>
#include <iostream>
int main()
{
try
{
int i = boost::lexical_cast<int>("abc");
std::cout << i << '\n';
}
catch (const boost::bad_lexical_cast &e)
{
std::cerr << e.what() << '\n';
}
}如果轉(zhuǎn)換失敗,則會拋出從 std::bad_cast 派生的 boost::bad_lexical_cast 類型的異常。示例 2 引發(fā)異常,因為字符串“abc”無法轉(zhuǎn)換為 int 類型的數(shù)字。
三、lexical_cast與c/c++提供類似接口的比較
3.1 兩者比較
標準c家族中包含此類函數(shù),例如atoi與itoa等,它們的缺點是:
(1)各個轉(zhuǎn)換都是單向的,雙向轉(zhuǎn)換為不同函數(shù),各種轉(zhuǎn)換函數(shù)不同,接口眾多;
(2)僅支持基礎數(shù)據(jù)類型的子集,如int,long,double;
(3)不能提供統(tǒng)一的接口,易用性差;
c++中提供了stringstream,使用它進行格式轉(zhuǎn)換可讀性較差,使用起點較高,只是簡單的轉(zhuǎn)換,stringstream太重量級。
boost提供了lexical_cast,使用統(tǒng)一接口形式實現(xiàn)任意類型之間的轉(zhuǎn)換,增強了易用性。但如果需要嚴密控制精度的轉(zhuǎn)換,仍然推薦使用stringstream;數(shù)值之間的轉(zhuǎn)換,推薦使用numeric_cast。
3.2 樣例
#include "iostream"
#include "boost/lexical_cast.hpp" // 需要包含的頭文件
using boost::lexical_cast;
using boost::bad_lexical_cast;
using namespace std;
int main()
{
char* p="32768";
int i=0;
try
{
i=lexical_cast<int>(p); // 將字符串轉(zhuǎn)化為整數(shù)
}
catch(bad_lexical_cast&) // 轉(zhuǎn)換失敗會拋出一個異常
{
i=0;
}
cout << i << endl;
return i;
}到此這篇關于C++ Boost實現(xiàn)數(shù)字與字符串轉(zhuǎn)化詳解的文章就介紹到這了,更多相關C++數(shù)字與字符串轉(zhuǎn)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
字符串拷貝函數(shù)memcpy和strncpy以及snprintf 的性能比較
以下是對字符串拷貝函數(shù)memcpy和strncpy以及snprintf它們之間的性能進行了比較,需要的朋友可以過來參考下2013-07-07
C++ vector如何動態(tài)申請內(nèi)存的元素
vector是一種動態(tài)數(shù)組,本文主要介紹了C++ vector如何動態(tài)申請內(nèi)存的元素,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07

