我有一个字符串向量,我想将其输出到流(实际上是文件流)。我想在向量元素之间有一个分隔符。有一种方法可以使用标准ostream_iterator
std::vector <std::string> strs;
std::ostream_iterator<std::string> out_file_iterator ( out_file, delim );
std::copy ( strs.begin(), strs.end(), out_file_iterator );
Run Code Online (Sandbox Code Playgroud)
我不喜欢这种方式,因为每个delim元素后面都有一个文本,但我不需要在最后一个元素后面有一个文本。我想用类似的东西。但是返回字符串和我的向量太大,无法将其输出到字符串。delimboost::joinboost::join
实现我的目标最优雅的方式是什么?
对于通用解决方案(未经测试):
template<class T>
class ostream_join_iterator {
public:
// Construct like an ostream_iterator.
ostream_join_iterator(std::ostream& stream,
const std::string& delimiter = "")
: stream(stream), delimiter(delimiter), first(true) {}
// Behave like an output iterator.
ostream_join_iterator& operator++() { return *this; }
ostream_join_iterator& operator++(int) { return *this; }
ostream_join_iterator& operator*() { return *this; }
// Output a delimiter before all but the first element.
template<class T>
ostream_join_iterator& operator=(const T& value) {
if (!first) {
stream << delimiter;
} else {
first = false;
}
stream << value;
return *this;
}
private:
std::ostream& stream;
const std::string delimiter;
bool first;
};
Run Code Online (Sandbox Code Playgroud)
您可以像常规一样使用它std::ostream_iterator:
std::copy(strings.begin(), strings.end(),
ostream_join_iterator<std::string>(file, delimiter));
Run Code Online (Sandbox Code Playgroud)