当前位置: 首页 > article >正文

Boost C++ `split()` 全面解析:高效字符串拆分与优化实践

文章目录

  • Boost C++ `split()` 全面解析:高效字符串拆分与优化实践
    • 1. `boost::split()` 的基本用法
      • 1.1 按空格拆分
      • 1.2 按多个分隔符拆分
      • 1.3 保留空字符串
      • 1.4 去除首尾空格
      • 1.5 过滤空字符串
    • 2. 性能优化:更高效的字符串拆分
      • 2.1 避免 `std::string` 拷贝
      • 2.2 使用 `std::string_view` 避免拷贝
    • 3. 复杂模式拆分:使用 `boost::algorithm::split_regex()`
    • 4. 现代 C++ 替代方案
      • 4.1 使用 `std::ranges::views::split`(C++23)
    • 总结

Boost C++ split() 全面解析:高效字符串拆分与优化实践

boost::split() 是 C++ 处理字符串拆分的强大工具,适用于多种场景,如按空格、多个分隔符拆分,保留空字符串,去除首尾空格等。本文将全面解析其用法,并结合 性能优化方案、正则拆分、高效迭代器及现代 C++ 替代方案,帮助你更高效地处理字符串。


1. boost::split() 的基本用法

1.1 按空格拆分

boost::split(result, str, boost::is_any_of(" "));

示例:

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

int main() {
  std::string str = "Hello Boost String Split";
  std::vector<std::string> result;

  boost::split(result, str, boost::is_any_of(" "));

  for (const auto& word : result) {
    std::cout << word << std::endl;
  }

  return 0;
}

输出:

Hello
Boost
String
Split

1.2 按多个分隔符拆分

boost::split(result, str, boost::is_any_of(",; "));

示例:

std::string str = "apple,orange;banana grape";
std::vector<std::string> result;
boost::split(result, str, boost::is_any_of(",; "));

for (const auto& word : result) std::cout << word << std::endl;

输出:

apple
orange
banana
grape

1.3 保留空字符串

默认情况下,boost::split() 会合并连续的分隔符,可使用 boost::token_compress_off 关闭此行为:

boost::split(result, str, boost::is_any_of(","), boost::token_compress_off);

示例:

std::string str = "one,,two,,three";
std::vector<std::string> result;
boost::split(result, str, boost::is_any_of(","), boost::token_compress_off);

for (const auto& word : result) std::cout << "[" << word << "]" << std::endl;

输出:

[one]
[]
[two]
[]
[three]

1.4 去除首尾空格

结合 boost::trim() 处理拆分后的数据:

for (auto& word : result) boost::trim(word);

示例:

std::string str = "  first, second , third  ";
std::vector<std::string> result;
boost::split(result, str, boost::is_any_of(","), boost::token_compress_on);

for (auto& word : result) {
  boost::trim(word);
  std::cout << "[" << word << "]" << std::endl;
}

输出:

[first]
[second]
[third]

1.5 过滤空字符串

result.erase(std::remove_if(result.begin(), result.end(),
                            [](const std::string& s) { return s.empty(); }),
             result.end());

示例:

std::string str = "apple,,orange,,banana";
std::vector<std::string> result;
boost::split(result, str, boost::is_any_of(","), boost::token_compress_off);

result.erase(std::remove_if(result.begin(), result.end(),
                            [](const std::string& s) { return s.empty(); }),
             result.end());

for (const auto& word : result) std::cout << word << std::endl;

输出:

apple
orange
banana

2. 性能优化:更高效的字符串拆分

2.1 避免 std::string 拷贝

使用 boost::split_iterator 遍历字符串,提高大规模数据处理性能:

#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split_iterator.hpp>
#include <iostream>

int main() {
  std::string str = "apple,banana,orange";
  auto it = boost::make_split_iterator(str, boost::first_finder(","));

  while (it != boost::split_iterator<std::string::iterator>()) {
    std::cout << "[" << *it << "]" << std::endl;
    ++it;
  }
}

2.2 使用 std::string_view 避免拷贝

在 C++17 之后,使用 std::string_view 提高效率:

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

int main() {
  std::string_view str = "apple, banana, orange";
  std::vector<std::string_view> result;

  boost::split(result, str, boost::is_any_of(", "), boost::token_compress_on);

  for (const auto& word : result) {
    if (!word.empty()) std::cout << "[" << word << "]" << std::endl;
  }
}

3. 复杂模式拆分:使用 boost::algorithm::split_regex()

如果 boost::split() 不能满足需求,可以用 正则表达式 拆分:

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

int main() {
  std::string str = "ID:123; Name:John_Doe; Age:30;";
  std::vector<std::string> result;

  boost::algorithm::split_regex(result, str, boost::regex(R"([;: ])"));

  for (const auto& word : result) {
    if (!word.empty()) std::cout << word << std::endl;
  }
}

输出:

ID
123
Name
John_Doe
Age
30

4. 现代 C++ 替代方案

方法适用场景
std::stringstream适用于简单拆分,性能一般
std::ranges::views::split (C++23)现代 C++ 方式,支持 std::string_view,性能更优
std::regex_token_iterator使用正则表达式拆分,适用于复杂分隔符
std::string::find() 手写拆分适用于极端性能优化场景

4.1 使用 std::ranges::views::split(C++23)

#include <iostream>
#include <ranges>
#include <string>

int main() {
  std::string str = "apple,banana,orange";
  auto words = str | std::views::split(',');

  for (auto&& word : words) {
    std::cout << std::string_view(word.begin(), word.end()) << std::endl;
  }
}

总结

需求代码
按空格拆分boost::split(result, str, boost::is_any_of(" "));
按多个分隔符拆分boost::split(result, str, boost::is_any_of(",; "));
保留空字符串boost::split(result, str, boost::is_any_of(","), boost::token_compress_off);
去除首尾空格boost::trim(word);
过滤空字符串std::remove_if()
高效拆分boost::split_iterator + std::string_view
使用正则拆分boost::algorithm::split_regex()
现代 C++ 替代方案std::ranges::views::split (C++23)

Boost 提供了丰富的字符串处理工具,在性能优化与现代 C++ 兼容性方面,各种方法各有优劣,选择最适合你的方案!🚀


http://www.kler.cn/a/595789.html

相关文章:

  • 关于 51 单片机显示多个数码管时出现残影
  • 正则表达式的基本概念及示例
  • PTA团体程序设计天梯赛-练习集51-55题
  • Docker从小白到入门:知识点速通与面试指南
  • SBOM风险预警 | 恶意NPM组件开展木马投毒攻击,目标针对国内泛互企业
  • 一般c++项目的目录结构
  • 【C++】C++类
  • 【ES】Elasticsearch学习
  • Java设计模式之命令模式
  • Swoole HTTP 服务中 同步、异步 和 协程 三种模式的对比
  • 【linux】服务器限制客户端ssh访问
  • 课程5. 迁移学习
  • 【计算机网络】网络简介
  • 决策树调参技巧
  • 【STM32实物】基于STM32的太阳能充电宝设计
  • stm32 2.0.1
  • 六十天前端强化训练之第二十五天之组件生命周期大师级详解(Vue3 Composition API 版)
  • Webpack 中动态导入(Dynamic Import)的几种典型用法
  • <项目> 主从Reactor模型的高并发服务器
  • UI前端与数字孪生:打造智慧城市的双引擎