最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++之std::stringstream的使用小結

 更新時間:2026年07月01日 08:47:28   作者:流星雨愛編程  
本文主要介紹了C++之std::stringstream的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1.簡介

std::stringstream 是 C++ 標準庫 <sstream> 頭文件提供的字符串流類,核心作用是在字符串基本數(shù)據(jù)類型之間做轉換,以及靈活地拼接 / 分割字符串。它屬于內(nèi)存流(而非文件流),所有操作都在內(nèi)存中完成,效率高且使用靈活。

頭文件:

#include <sstream>   // 核心:字符串流
#include <iostream>  // 控制臺輸出(輔助)
#include <string>    // 處理字符串(輔助)
using namespace std; // 簡化代碼,實際項目可按需省略

<sstream> 提供三個核心類(均繼承自 std::iostream):

類名	核心功能	類比
std::istringstream	只讀字符串流(輸入流)	類似 ifstream
std::ostringstream	只寫字符串流(輸出流)	類似 ofstream
std::stringstream	讀寫字符串流(雙向流)	類似 fstream

2.核心功能與示例

2.1.類型轉換(最常用)

stringstream 是 C++ 中靈活的類型轉換工具,可實現(xiàn)任意基本類型(int/float/double 等)與字符串的互轉,比 atoi/atof 或 C++11 的 std::to_string 更通用(支持多類型混合轉換)。

1.數(shù)字 → 字符串

// 單個數(shù)字轉字符串
int num = 123;
ostringstream oss;
oss << num; // 像輸出到控制臺一樣寫入字符串流
string str_num = oss.str(); // 獲取流中的字符串
cout << "int轉string:" << str_num << endl; // 輸出:123

// 多類型混合轉字符串
double pi = 3.14159;
bool flag = true;
ostringstream oss2;
oss2 << "π = " << pi << ",是否有效:" << boolalpha << flag;
string str_mix = oss2.str();
cout << str_mix << endl; // 輸出:π = 3.14159,是否有效:true

2.字符串 → 數(shù)字

// 字符串轉單個數(shù)字
string str = "456.789";
istringstream iss(str);
double d;
iss >> d; // 像從控制臺讀取一樣解析字符串
if (iss.fail()) { // 檢查轉換是否失?。ㄈ缱址菙?shù)字)
    cerr << "轉換失??!" << endl;
} else {
    cout << "string轉double:" << d << endl; // 輸出:456.789
}

// 字符串轉多個數(shù)字(按空格分割)
string str_multi = "10 20.5 300";
istringstream iss2(str_multi);
int a;
double b;
int c;
iss2 >> a >> b >> c;
cout << a << " " << b << " " << c << endl; // 輸出:10 20.5 300

2.2.字符串拼接

ostringstream 比直接用 + 拼接字符串更高效(減少臨時字符串創(chuàng)建),尤其適合大量拼接場景。

// 低效方式:多次+拼接(產(chǎn)生臨時對象)
string s1 = "姓名:" + "張三" + ",年齡:" + to_string(20); 

// 高效方式:ostringstream拼接
ostringstream oss;
oss << "姓名:" << "張三" 
    << ",年齡:" << 20 
    << ",分數(shù):" << 95.5;
string s2 = oss.str();
cout << s2 << endl; // 輸出:姓名:張三,年齡:20,分數(shù):95.5

2.3.字符串分割

istringstream 配合 >> 或 getline() 可輕松分割字符串(按空格、逗號、冒號等分隔符)。

1.按空格 / 制表符分割(默認)

string str = "apple banana orange grape";
istringstream iss(str);
string word;
// >> 自動跳過空格/制表符/換行符,讀取到下一個分隔符為止
while (iss >> word) {
    cout << word << endl;
}
// 輸出:
// apple
// banana
// orange
// grape

2.按自定義分隔符分割(如逗號、冒號)

需配合 getline() 指定分隔符:

string str = "1,2,3,4,5";
istringstream iss(str);
string token;
// getline(流, 接收字符串, 分隔符)
while (getline(iss, token, ',')) {
    cout << token << endl;
}
// 輸出:
// 1
// 2
// 3
// 4
// 5

// 按冒號分割示例
string str2 = "name:張三:age:20:score:95.5";
istringstream iss2(str2);
string t;
while (getline(iss2, t, ':')) {
    cout << t << endl;
}

3.進階用法

1.清空 / 重置 stringstream

stringstream 的清空需注意兩個關鍵點:

  • clear():僅重置流的狀態(tài)標志(如 eof/fail 標志),不清空內(nèi)部字符串;
  • str(""):清空內(nèi)部存儲的字符串內(nèi)容;
  • 如需復用流,需同時調(diào)用 clear() + str("")。
stringstream ss;
ss << "test 123";
cout << "初始內(nèi)容:" << ss.str() << endl; // 輸出:test 123

// 錯誤:僅clear(),內(nèi)容仍在
ss.clear();
cout << "僅clear()后:" << ss.str() << endl; // 輸出:test 123

// 正確:清空內(nèi)容 + 重置狀態(tài)
ss.str(""); // 清空內(nèi)容
ss.clear(); // 重置狀態(tài)(避免之前的狀態(tài)影響后續(xù)操作)
ss << "new content";
cout << "重置后:" << ss.str() << endl; // 輸出:new content

2.獲取 / 設置流的內(nèi)容

  • str():無參數(shù) → 獲取流中的字符串;
  • str(const string& s):有參數(shù) → 設置流的初始內(nèi)容。
stringstream ss;
ss.str("初始內(nèi)容"); // 設置初始內(nèi)容
cout << ss.str() << endl; // 輸出:初始內(nèi)容

ss << " + 追加內(nèi)容";
cout << ss.str() << endl; // 輸出:初始內(nèi)容 + 追加內(nèi)容

4.注意事項

  1. 清空誤區(qū):切勿僅用 clear() 清空內(nèi)容,必須配合 str("");
  2. 性能優(yōu)勢:拼接大量字符串時,ostringstream 遠優(yōu)于 string::operator+(減少內(nèi)存拷貝);
  3. 錯誤處理:類型轉換 / 分割時,需檢查 fail()/good() 狀態(tài),避免無效轉換(如字符串 "abc" 轉 int);
  4. 線程安全stringstream 非線程安全,多線程操作需加鎖;
  5. 內(nèi)存占用stringstream 會緩存數(shù)據(jù),大量數(shù)據(jù)處理后及時清空或析構,避免內(nèi)存泄漏;
  6. bool 類型輸出:默認輸出 1/0,需用 boolalpha 操縱符輸出 true/false
ostringstream oss;
oss << boolalpha << true; // 輸出 true
oss << noboolalpha << true; // 輸出 1(恢復默認)

5.總結

std::stringstream 是 C++ 處理字符串的 “瑞士軍刀”,核心價值:

  • 靈活的類型轉換(數(shù)字↔字符串);
  • 高效的字符串拼接;
  • 便捷的字符串分割
  • 所有操作在內(nèi)存中完成,無 IO 開銷,性能優(yōu)異。

實際開發(fā)中,優(yōu)先用 istringstream 處理 “讀 / 解析”、ostringstream 處理 “寫 / 拼接”,stringstream 僅在需要雙向操作時使用(略占內(nèi)存)。

到此這篇關于C++之std::stringstream的使用小結的文章就介紹到這了,更多相關C++ std::stringstream內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

阜平县| 合水县| 本溪市| 庆云县| 宜州市| 巴中市| 筠连县| 潼南县| 巨鹿县| 望谟县| 辽宁省| 黄龙县| 东丰县| 青龙| 富平县| 克东县| 曲靖市| 岳普湖县| 双牌县| 和林格尔县| 左云县| 上饶市| 师宗县| 梧州市| 布拖县| 罗定市| 宾阳县| 建湖县| 茂名市| 芜湖市| 淮南市| 略阳县| 尉氏县| 南京市| 梓潼县| 宜春市| 天镇县| 桃源县| 陕西省| 白山市| 鹰潭市|