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

C++字符串提取和分割的多種方法

 更新時間:2025年03月23日 11:24:28   作者:星途碼客  
在C++編程中,字符串處理是一個常見的任務(wù),尤其是在需要從字符串中提取特定數(shù)據(jù)時,本文將詳細探討如何使用C++標準庫中的工具來提取和分割字符串,并分析不同方法的適用場景和優(yōu)缺點,我們將通過多個示例代碼逐步講解,幫助讀者掌握字符串處理的技巧,需要的朋友可以參考下

1. 字符串提取的基本方法

1.1 使用 std::istringstream 和 >> 操作符

std::istringstream 是 C++ 標準庫中的一個類,它將字符串作為輸入流來處理。通過 >> 操作符,我們可以從流中提取以空格分隔的單詞或數(shù)字。

示例代碼

#include <iostream>
#include <sstream>
#include <string>
 
int main() {
    std::string s = "id13 id1 id6 id0 id8 id6 id0";
    std::istringstream iss(s);
    std::string token;
 
    while (iss >> token) {
        std::cout << token << std::endl;
    }
 
    return 0;
}

輸出

id13
id1
id6
id0
id8
id6
id0

分析

  • iss >> token 會按空格分隔字符串,逐個提取單詞。

  • 這種方法適用于字符串中的單詞是用空格分隔的簡單場景。

1.2 提取 id 后面的數(shù)字

如果需要從類似 "id13 id1 id6" 的字符串中提取 id 后面的數(shù)字,可以使用 std::string::substr 方法。

示例代碼

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
 
int main() {
    std::string s = "id13 id1 id6 id0 id8 id6 id0";
    std::istringstream iss(s);
    std::string token;
    std::vector<int> ids;
 
    while (iss >> token) {
        if (token.substr(0, 2) == "id") {
            int id = std::stoi(token.substr(2));
            ids.push_back(id);
        }
    }
 
    for (int id : ids) {
        std::cout << id << std::endl;
    }
 
    return 0;
}

輸出

13
1
6
0
8
6
0

分析

  • token.substr(2) 從 token 的第 2 個字符開始提取子串,跳過 "id"。

  • 無論 id 后面的數(shù)字是一位數(shù)、兩位數(shù)還是三位數(shù),substr(2) 都能正確提取。

  • 這種方法簡潔高效,適用于提取固定前綴后的數(shù)字。

2. 處理復雜分隔符

2.1 使用 std::getline 自定義分隔符

如果字符串的分隔符不是空格(例如逗號 , 或分號 ;),可以使用 std::getline 并指定分隔符。

示例代碼

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
 
int main() {
    std::string s = "id13,id1,id6,id0,id8,id6,id0";
    std::istringstream iss(s);
    std::string token;
    std::vector<int> ids;
 
    while (std::getline(iss, token, ',')) {
        if (token.substr(0, 2) == "id") {
            int id = std::stoi(token.substr(2));
            ids.push_back(id);
        }
    }
 
    for (int id : ids) {
        std::cout << id << std::endl;
    }
 
    return 0;
}

輸出

13
1
6
0
8
6
0

分析

  • std::getline(iss, token, ',') 會按逗號分隔字符串,逐個提取單詞。

  • 這種方法適用于處理自定義分隔符的場景。

2.2 處理多行輸入

如果輸入是多行的,std::getline 也可以按行提取內(nèi)容。

示例代碼

#include <iostream>
#include <sstream>
#include <string>
 
int main() {
    std::string s = "id13 id1 id6\nid0 id8 id6\nid0";
    std::istringstream iss(s);
    std::string line;
 
    while (std::getline(iss, line)) {
        std::istringstream lineStream(line);
        std::string token;
        while (lineStream >> token) {
            std::cout << token << std::endl;
        }
    }
 
    return 0;
}

輸出

id13
id1
id6
id0
id8
id6
id0

分析

  • 外層 std::getline 按行提取內(nèi)容。

  • 內(nèi)層 lineStream >> token 按空格分隔每行的單詞。

  • 這種方法適用于處理多行輸入的場景。

3. 高級字符串處理技巧

3.1 使用正則表達式

C++11 引入了 <regex> 庫,支持正則表達式匹配,可以更靈活地處理字符串。

示例代碼

#include <iostream>
#include <regex>
#include <string>
#include <vector>
 
int main() {
    std::string s = "id13 id1 id6 id0 id8 id6 id0";
    std::regex pattern(R"(id(\d+))");
    std::smatch matches;
    std::vector<int> ids;
 
    auto words_begin = std::sregex_iterator(s.begin(), s.end(), pattern);
    auto words_end = std::sregex_iterator();
 
    for (std::sregex_iterator i = words_begin; i != words_end; ++i) {
        std::smatch match = *i;
        int id = std::stoi(match.str(1));
        ids.push_back(id);
    }
 
    for (int id : ids) {
        std::cout << id << std::endl;
    }
 
    return 0;
}

輸出

13
1
6
0
8
6
0

分析

  • 使用正則表達式 R"(id(\d+))" 匹配 id 后面的數(shù)字。

  • 這種方法 功能強大,但語法較復雜,適合處理復雜的字符串匹配任務(wù)。

3.2 性能優(yōu)化

對于大規(guī)模數(shù)據(jù)處理,性能可能成為瓶頸??梢酝ㄟ^以下方法優(yōu)化:

  • 避免頻繁創(chuàng)建和銷毀 std::istringstream 對象。

  • 使用 std::string_view(C++17)減少字符串拷貝。

示例代碼

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
 
int main() {
    std::string s = "id13 id1 id6 id0 id8 id6 id0";
    std::istringstream iss(s);
    std::string token;
    std::vector<int> ids;
    ids.reserve(10); // 預(yù)分配空間
 
    while (iss >> token) {
        if (token.substr(0, 2) == "id") {
            int id = std::stoi(token.substr(2));
            ids.push_back(id);
        }
    }
 
    for (int id : ids) {
        std::cout << id << std::endl;
    }
 
    return 0;
}

分析

  • 預(yù)分配 ids 的空間可以減少動態(tài)內(nèi)存分配的開銷。

  • 使用 std::string_view 可以避免不必要的字符串拷貝。

4. 總結(jié)

本文詳細介紹了 C++ 中字符串提取和分割的多種方法,包括:

  1. 使用 std::istringstream 和 >> 操作符按空格分隔字符串。

  2. 使用 std::getline 處理自定義分隔符和多行輸入。

  3. 使用正則表達式處理復雜的字符串匹配任務(wù)。

  4. 通過性能優(yōu)化技巧提高代碼效率。

每種方法都有其適用的場景和優(yōu)缺點,開發(fā)者可以根據(jù)具體需求選擇合適的方法。掌握這些技巧后,你將能夠高效地處理各種字符串任務(wù),提升代碼的可讀性和性能。

以上就是C++字符串提取和分割的多種方法的詳細內(nèi)容,更多關(guān)于C++字符串提取和分割的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言 二叉查找樹性質(zhì)詳解及實例代碼

    C語言 二叉查找樹性質(zhì)詳解及實例代碼

    這篇文章主要介紹了C語言 二叉查找樹性質(zhì)詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Cocos2d-x中使用CCScrollView來實現(xiàn)關(guān)卡選擇實例

    Cocos2d-x中使用CCScrollView來實現(xiàn)關(guān)卡選擇實例

    這篇文章主要介紹了Cocos2d-x中使用CCScrollView來實現(xiàn)關(guān)卡的選擇實例,本文在代碼中用大量注釋講解了CCScrollView的使用,需要的朋友可以參考下
    2014-09-09
  • makefile如何調(diào)用靜態(tài)庫的方法實現(xiàn)

    makefile如何調(diào)用靜態(tài)庫的方法實現(xiàn)

    這篇文章主要介紹了makefile如何調(diào)用靜態(tài)庫的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 深入c++中臨時對象的析構(gòu)時機的詳解

    深入c++中臨時對象的析構(gòu)時機的詳解

    本篇文章對c++中臨時對象的析構(gòu)時機進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 在Vitis?IDE中如何使用第三方庫?libtiff?保存?tiff?文件

    在Vitis?IDE中如何使用第三方庫?libtiff?保存?tiff?文件

    這篇文章主要介紹了在Vitis?IDE中如何使用第三方庫?libtiff?保存?tiff?文件,本文通過圖文實例相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 編寫C++程序使DirectShow進行視頻捕捉

    編寫C++程序使DirectShow進行視頻捕捉

    這篇文章主要介紹了如何編寫C++程序來使DirectShow進行視頻捕捉的方法,DirectShow是微軟公司在ActiveMovie和Video for Windows的基礎(chǔ)上推出的新一代基于COM(Component Object Model)的流媒體處理的開發(fā)包,要的朋友可以參考下
    2016-03-03
  • C++中std::allocator的具體使用

    C++中std::allocator的具體使用

    本文主要介紹了C++中的std::allocator的作用、內(nèi)存分配與構(gòu)造的解耦機制,以及placementnew的使用,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2025-07-07
  • 超詳細分析C語言動態(tài)內(nèi)存管理問題

    超詳細分析C語言動態(tài)內(nèi)存管理問題

    動態(tài)內(nèi)存是相對靜態(tài)內(nèi)存而言的。所謂動態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文帶你深入探究C語言中動態(tài)內(nèi)存的管理
    2022-04-04
  • C語言驅(qū)動開發(fā)之內(nèi)核使用IO/DPC定時器詳解

    C語言驅(qū)動開發(fā)之內(nèi)核使用IO/DPC定時器詳解

    本章將繼續(xù)探索驅(qū)動開發(fā)中的基礎(chǔ)部分,定時器在內(nèi)核中同樣很常用,在內(nèi)核中定時器可以使用兩種,即IO定時器,以及DPC定時器,感興趣的可以了解一下
    2023-04-04
  • C++map,set,multiset,multimap詳細解析

    C++map,set,multiset,multimap詳細解析

    在C++標準模板庫(STL)中,容器分為關(guān)聯(lián)式容器和序列式容器兩大類,關(guān)聯(lián)式容器主要包括set、map、multiset和multimap,通過索引來訪問元素,本文給大家介紹C++?map,set,multiset,multimap的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2024-09-09

最新評論

衡东县| 高青县| 三门峡市| 宣汉县| 望谟县| 思茅市| 武山县| 苏州市| 天气| 中西区| 安吉县| 裕民县| 黎平县| 长宁区| 宜都市| 英吉沙县| 惠东县| 特克斯县| 瓦房店市| 利川市| 微山县| 雅江县| 富民县| 甘洛县| 湘乡市| 邢台市| 麦盖提县| 平陆县| 永宁县| 深圳市| 金山区| 固阳县| 太白县| 镇江市| 山阳县| 上高县| 阿城市| 麟游县| 龙南县| 楚雄市| 贵州省|