C++ stringstream使用详解

目录

    • stringstream介绍
    • 用途
      • 实现安全的数据类型转换
      • 实现句子和单个单词的转换
    • 注意事项
    • 参考文献

在刷leetcode时碰到二叉树序列化和反序列化的设计,可以通过stringstream来实现。但是发现不大熟悉stringstream,参考别的文章(参考文章已放在参考文献中)总结一下用法。

stringstream介绍

该类包含在头文件中,另外该头文件中还定义了istringstream、ostringstream,分别用来进行流的输入、输出。除此以外,每个类都有一个对应的宽字符集版本。

用途

实现安全的数据类型转换

  • 数字类型转string类型
void main() {
	int a = 10;
	string b;
	stringstream ss;
	ss << a;
	ss >> b;  // b="50"
}
  • string类型转数字类型
void main() {
	int a;
	string b = "100";
	stringstream ss;
	ss << b;
	ss >> a;  // a=100
}
  • string转wstring
// string->int->wstring
void main() {
	int a;
	string b = "100";
	wstring c;
	stringstream ss;
	ss << b;
	ss >> a;  // a=100
	
	wstringstream ws;
	ws << a;
	ws >> c;  
}

实现句子和单个单词的转换

stringstream中默认以空格作为分隔符

  • 句子转单个单词
void main() {
	string a = "how old are you, dear ?";
	stringstream ss;
	ss << a;
	string b;
	while(ss >> b) {
		cout << b << endl;
	}
}

// 输出:
// how
// old
// are
// you,
// dear
// ?
  • 单个单词拼接为句子
void main() {
	stringstream ss;
	ss << "how" << " " << "old" << " " << "are" << " " << "you," << " " << "dear" << " " << "?";
	string b;
	b = ss.str();
	cout << b << endl;
}

注意事项

  • cout能使用的所有ios格式标记也可以在stringstream对象中使用
  • 重复使用stringstream对象,需要在每次转换前使用clear()方法,提高效率
  • stringstream对象的构造和析构通常耗费较多的CPU时间,建议重复使用stringstream对象
  • 可以定义函数模板完成任意类型到特定目标类型的转换
// 例:数字类型转string
template
void to_string(string& result, const T& t) {
	ostringstream oss;
	oss << t;
	result = oss.str();
}

// 例:任意类型之间的转换
template
out_type convert(const in_type& t) {
	stringstream stream;
	stream << t;
	out_type result;
	stream >> result;
	return result;
}
  • 除了基本类型的转换,也支持char*的转换,如下:
int main()
{
    std::stringstream stream;
    char result[8] ;
    stream << 8888; //向stream中插入8888
    stream >> result; //抽取stream中的值到result
    std::cout << result << std::endl; // 屏幕显示 "8888"
} 

参考文献

  • STL之Stringstream字符串流使用总结
  • C++中stringstream 的作用

你可能感兴趣的:(C++)