将字符串向量连接到 std::ostream (如 boost::join)

2024-03-19

我有一个字符串向量,我想将其输出到流(实际上是文件流)。我想在向量元素之间有一个分隔符。有一种方法可以使用标准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 );

我不喜欢这种方式,因为有一个delim每个元素之后的文本,但我不需要有delim在最后一个元素之后。我想用类似的东西boost::join。然而boost::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;

};

您可以像平常一样使用它std::ostream_iterator:

std::copy(strings.begin(), strings.end(),
    ostream_join_iterator<std::string>(file, delimiter));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将字符串向量连接到 std::ostream (如 boost::join) 的相关文章

随机推荐