c++ - 如何从 std::vector 转换到 std::istream?
问题描述
我有一个 std::vector 并且该函数需要一个 std::istream:
callMe(std::istream& is)
进行转换的最佳方法是什么?还有比这更聪明的吗?
std::stringstream sstr;
for(int i = 0; i < myVector.size(); ++i) {
sstr << myVector[i] << " ";
}
std::istringstream istr{sstr.str()};
callMe(istr);
编辑:感谢到目前为止的建议!更新代码:
std::stringstream sstr;
for(const float& val : myVector) {
sstr << val << " ";
}
callMe(sstr);
解决方案
问题在于它std::istream
本质上是基于字符的。如果您想继续callMe(std::istream& is)
用作界面,您必须将每个元素转换myVector
为字符并在某个时候返回。如果您想坚持使用此选项,我个人会找到ostream_iterator
一个优雅的解决方案:
copy(begin(data), end(data), std::ostream_iterator<float>(sstr));
完整示例:
void callMeStream(std::istream &is)
{
float f1;
is >> f1;
std::cout << "Stream: " << f1 << std::endl;
}
// ...
std::vector<float> data = {3.5, 1.5, 2.5 /* ... */};
std::stringstream sstr;
copy(begin(data), end(data), std::ostream_iterator<float>(sstr));
callMeStream(sstr); // Output: "Stream: 3.51"
如果您愿意更改 的签名callMe
,则可以避免这种转换:
template <class T>
void callMeTemplate(T &is)
{
float f1;
is >> f1;
std::cout << "Template: " << f1 << std::endl;
}
#define NO_ELEMENT -1.0;
class data_wrapper
{
std::vector<float>::const_iterator current;
const std::vector<float>::const_iterator last;
public:
data_wrapper(const std::vector<float> &data) : current(begin(data)), last(end(data)) {}
data_wrapper &operator>>(float &value)
{
if (last == current)
{
value = NO_ELEMENT;
}
else
{
value = *current++;
}
return *this;
}
};
// ...
data_wrapper wrapper(data);
callMeTemplate(wrapper); // Output: "Template: 3.5"
在第二个示例中,该float
值永远不会转换为字符序列,并且可以同时接受data_wrapper
和std::istream
类型。当然,如果您愿意callMe
完全更改 的签名,您不妨将其更改为接受开始/结束迭代器范围或vector
直接接受。
推荐阅读
- java - org.springframework.jdbc.support.MetaDataAccessException:提取DatabaseMetaData时出错
- akka - akka-quartz-scheduler:找不到匹配的石英配置
- c++ - 我们可以在 C++ 中使用向量来获取未知大小的用户输入,直到我们按下回车键?
- delphi - WinInet InternetCloseHandle 不关闭连接
- python - 实现pop3客户端
- java - 在 java 中生成报告 pdf - swing、table
- python-3.x - Pysimplegui 比迪支持
- jquery - 如果字符串等于则加载 div
- c++ - Windows 控制台应用程序何时需要调用 CoInitialize
- pandas - 使用 Python,如果您的数据没有每个类别中的数据,您如何制作包含所有 24 个楔形的时间轮?