C++ 中的 boost::split 函式

Jinku Hu 2023年10月12日
  1. 使用 boost::split 函式來標記給定的字串
  2. 使用 stringstreamgetline 函式使用分隔符拆分字串
C++ 中的 boost::split 函式

本文將演示如何在 C++ 中使用 boost::split 函式。

使用 boost::split 函式來標記給定的字串

Boost 提供了強大的工具,可以使用成熟且經過良好測試的庫來擴充套件 C++ 標準庫。本文探討了 boost::split 函式,它是 Boost 字串演算法庫的一部分。後者包括幾種字串操作演算法,如修剪、替換等。

boost::split 函式將給定的字串序列拆分為由分隔符分隔的標記。使用者應提供將定界符標識為第三個引數的謂詞函式。如果給定元素是分隔符,則提供的函式應返回 true

在下面的示例中,我們指定了一個 isspace 函式物件來標識給定文字中的空格並將它們拆分為標記。boost::split 還需要一個目標序列容器來儲存標記化的子字串。請注意,目標容器作為第一個引數傳遞,並且在函式呼叫後會覆蓋其先前的內容。

#include <boost/algorithm/string/split.hpp>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main() {
  string text = "Lorem ipsum  dolor sit amet, consectetur adipiscing elit.";
  vector<string> words;

  boost::split(words, text, isspace);
  for (const auto &item : words) {
    cout << item << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

輸出:

Lorem; ipsum; ; dolor; sit; amet,; consectetur; adipiscing; elit.;

當兩個或多個分隔符彼此相鄰時,前面程式碼片段中的 boost::split 呼叫會儲存空字串。不過,我們可以指定第四個可選引數 - boost::token_compress_on 並且相鄰的分隔符將被合併,如下例所示。請注意,如果你想成功執行這兩個程式碼片段,則必須在系統上安裝 Boost 庫。

#include <boost/algorithm/string/split.hpp>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::stringstream;
using std::vector;

int main() {
  string text = "Lorem ipsum  dolor sit amet, consectetur adipiscing elit.";
  vector<string> words;

  boost::split(words, text, isspace, boost::token_compress_on);
  for (const auto &item : words) {
    cout << item << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

輸出:

Lorem; ipsum; dolor; sit; amet,; consectetur; adipiscing; elit.;

使用 stringstreamgetline 函式使用分隔符拆分字串

或者,可以使用 stringstream 類和 getline 函式用給定的字元分隔符拆分文字。在這種情況下,我們只使用 STL 工具,不需要包含 Boost 標頭檔案。請注意,此程式碼版本較大,需要額外的步驟來合併相鄰的分隔符。

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::stringstream;
using std::vector;

int main() {
  string text = "Lorem ipsum  dolor sit amet, consectetur adipiscing elit.";
  vector<string> words;

  char space_char = ' ';
  stringstream sstream(text);
  string word;
  while (std::getline(sstream, word, space_char)) {
    words.push_back(word);
  }

  for (const auto &item : words) {
    cout << item << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

輸出:

Lorem; ipsum; ; dolor; sit; amet,; consectetur; adipiscing; elit.;
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Boost