C++功能模块实现

本文打算做成一个系列,旨在用C++简洁地实现一些实用的且常用的功能模块。

1.按已知给定分割符分割string

功能描述:(以我的应用为例)

  • 某时刻激光雷达传感器扫描得到了1080个int型距离数据,写入到了某个.txt文件中,且以;为两个数据间的分割符。【注】,该1080个数据在同一行。
  • 目前,已使用ifstream从文件中读入了该行数据保存在string类型变量line中!目标就是将这1080个数据存放到vector类型变量data中!

上代码!
版本1,利用string流实现

std::vector split(const std::string& line) {
	vector data;
	istringstream record(line);     //  将一个string流,绑定到刚读入的行line上
	int distance; char delim;        // 以某个字符分割两个数据,不限于逗号,空格、分号也可以!
	if (record >> distance) {
		data.push_back(distance);
		while (record >> delim >> distance) {
			res.push_back(distance);
		}
	}
	return data;
}

版本2,利用C语言string.h库中的strtok_s

#include // 需要包含的头文件!

std::vector c_split(const std::string& line, const std::string& delim) {
	vector data;
	if (str == "") return data;
	char* strs = new char[line.length() + 1];
	strcpy_s(strs, line.length() + 1, line.c_str());  // cstring中的函数 line->strs
	char* d = new char[delim.length() + 1];
	strcpy_s(d, delim.length() + 1, delim.c_str());  // string向c风格字符串的转换

	char* token = NULL;
	char* next_token = NULL;
	token = strtok_s(strs, d, &next_token); // 关键一句
	while (token) {
		string s = token;
		data.push_back(std::stoi(s));   // 注,此处可以直接使用 
		token = strtok_s(NULL, d, &next_token);
	}
	delete[] strs;
	delete[] d;
	return data;
}

评价,版本1在本应用中更为简洁!但同时版本2在其他应用中更有优势。
例如:如果要求分割以;间隔的人名LiLei;HanMeimei;ZhangSheng,则版本1暂时还未想好如何简洁地实现。

你可能感兴趣的:(▶,CPP)