C++ Boost實(shí)現(xiàn)數(shù)字與字符串轉(zhuǎn)化詳解
一、引言
在boost庫(kù)中,有一個(gè)函數(shù)Boost.LexicalCast可以將數(shù)字和字符串進(jìn)行雙向轉(zhuǎn)換。本文介紹這種用法的案例。
二、Boost.LexicalCast
Boost.LexicalCast 提供了一個(gè)轉(zhuǎn)換運(yùn)算符,boost::lexical_cast,它可以將數(shù)字從字符串轉(zhuǎn)換為數(shù)字類型,例如 int 或 double ,反之亦然。 boost::lexical_cast 是 std::stoi()、std::stod() 和 std::to_string() 等函數(shù)的替代方案,這些函數(shù)已添加到 C++11 的標(biāo)準(zhǔn)庫(kù)中。
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)換運(yùn)算符 boost::lexical_cast 可以轉(zhuǎn)換不同類型的數(shù)字。示例 6.1 首先將整數(shù) 123 轉(zhuǎn)換為字符串,然后將字符串轉(zhuǎn)換為浮點(diǎn)數(shù)。要使用 boost::lexical_cast,請(qǐng)包含頭文件 boost/lexical_cast.hpp。
boost::lexical_cast 在內(nèi)部使用流來(lái)執(zhí)行轉(zhuǎn)換。因此,只能轉(zhuǎn)換具有重載運(yùn)算符<< 和運(yùn)算符>> 的類型。但是,可以針對(duì)某些類型優(yōu)化 boost::lexical_cast 以實(shí)現(xiàn)更有效的轉(zhuǎn)換。
2.2 示例2
boost::bad_lexical_cast當(dāng)出錯(cuò)時(shí)
#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)換失敗,則會(huì)拋出從 std::bad_cast 派生的 boost::bad_lexical_cast 類型的異常。示例 2 引發(fā)異常,因?yàn)樽址?ldquo;abc”無(wú)法轉(zhuǎn)換為 int 類型的數(shù)字。
三、lexical_cast與c/c++提供類似接口的比較
3.1 兩者比較
標(biāo)準(zhǔn)c家族中包含此類函數(shù),例如atoi與itoa等,它們的缺點(diǎn)是:
(1)各個(gè)轉(zhuǎn)換都是單向的,雙向轉(zhuǎn)換為不同函數(shù),各種轉(zhuǎn)換函數(shù)不同,接口眾多;
(2)僅支持基礎(chǔ)數(shù)據(jù)類型的子集,如int,long,double;
(3)不能提供統(tǒng)一的接口,易用性差;
c++中提供了stringstream,使用它進(jìn)行格式轉(zhuǎn)換可讀性較差,使用起點(diǎn)較高,只是簡(jiǎn)單的轉(zhuǎn)換,stringstream太重量級(jí)。
boost提供了lexical_cast,使用統(tǒng)一接口形式實(shí)現(xiàn)任意類型之間的轉(zhuǎn)換,增強(qiáng)了易用性。但如果需要嚴(yá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)換失敗會(huì)拋出一個(gè)異常
{
i=0;
}
cout << i << endl;
return i;
}到此這篇關(guān)于C++ Boost實(shí)現(xiàn)數(shù)字與字符串轉(zhuǎn)化詳解的文章就介紹到這了,更多相關(guān)C++數(shù)字與字符串轉(zhuǎn)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)套接字操作的示例代碼
在C語(yǔ)言中,套接字(Socket)是一種進(jìn)行網(wǎng)絡(luò)通信的接口,這篇文章就來(lái)和大家介紹一下C語(yǔ)言中是如何進(jìn)行套接字操作的,需要的可以參考一下2023-06-06
C++ 風(fēng)靡一時(shí)的連連看游戲的實(shí)現(xiàn)流程詳解
游戲“連連看”是源自臺(tái)灣的桌面小游戲,自從流入大陸以來(lái)風(fēng)靡一時(shí),也吸引眾多程序員開發(fā)出多種版本的“連連看”。這其中,顧芳編寫的“阿達(dá)連連看”以其精良的制作廣受好評(píng),這也成為顧方“阿達(dá)系列軟件”的核心產(chǎn)品。并于2004年,取得國(guó)家版權(quán)局的計(jì)算機(jī)軟件登記證書2021-11-11
C語(yǔ)言簡(jiǎn)明講解快速排序的應(yīng)用
快速排序由于排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經(jīng)常被采用,再加上快速排序思想----分治法也確實(shí)實(shí)用,因此很多軟件公司的筆試面試,包括像騰訊,微軟等知名IT公司都喜歡考這個(gè),還有大大小的程序方面的考試如軟考,考研中也常常出現(xiàn)快速排序的身影2022-05-05
C語(yǔ)言超詳細(xì)講解結(jié)構(gòu)體與聯(lián)合體的使用
結(jié)構(gòu)體和聯(lián)合體用于描述事物的屬性,如一只鳥的信息,可能包括它的品種,體重,顏色,年齡等,接下來(lái)大家一起來(lái)詳細(xì)看看吧2022-05-05
關(guān)于C/C++中typedef的定義與用法總結(jié)
在C還是C++代碼中,typedef都使用的很多,在C代碼中尤其是多,typedef與#define有些相似,其實(shí)是不同的,特別是在一些復(fù)雜的用法上,需要的朋友可以參考下2012-12-12
字符串拷貝函數(shù)memcpy和strncpy以及snprintf 的性能比較
以下是對(duì)字符串拷貝函數(shù)memcpy和strncpy以及snprintf它們之間的性能進(jìn)行了比較,需要的朋友可以過(guò)來(lái)參考下2013-07-07
關(guān)于memcpy和memmove的一點(diǎn)重要說(shuō)明
下面小編就為大家?guī)?lái)一篇關(guān)于memcpy和memmove的一點(diǎn)重要說(shuō)明。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
C++ vector如何動(dòng)態(tài)申請(qǐng)內(nèi)存的元素
vector是一種動(dòng)態(tài)數(shù)組,本文主要介紹了C++ vector如何動(dòng)態(tài)申請(qǐng)內(nèi)存的元素,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07

