c++ - 如何使用 std::copy 读取任意数量的值?

标签 c++ iterator stl-algorithm istream-iterator

我正在尝试编写与此相反的操作:

std::ostream outs; // properly initialized of course
std::set<int> my_set; // ditto

outs << my_set.size();
std::copy( my_set.begin(), my_set.end(), std::ostream_iterator<int>( outs ) );

应该是这样的:

std::istream ins;

std::set<int>::size_type size;
ins >> size;

std::copy( std::istream_iterator<int>( ins ), std::istream_iterator<int>( ins ) ???, std::inserter( my_set, my_set.end() ) );

但我坚持使用“结束”迭代器——输入交互器不能使用 std::advance 并且我也不能使用具有相同源的两个流...

有什么优雅的方法可以解决这个问题吗?当然我可以使用 for 循环,但也许还有更好的方法:)

最佳答案

您可以从 istream_iterator 派生。
虽然使用 Daemin generator method是另一种选择,尽管我会直接生成到集合中而不是使用中间 vector 。

#include <set>
#include <iterator>
#include <algorithm>
#include <iostream>


template<typename T>
struct CountIter: public std::istream_iterator<T>
{
    CountIter(size_t c)
        :std::istream_iterator<T>()
        ,count(c)
    {}
    CountIter(std::istream& str)
        :std::istream_iterator<T>(str)
        ,count(0)
    {}

    bool operator!=(CountIter const& rhs) const
    {
        return (count != rhs.count) && (dynamic_cast<std::istream_iterator<T> const&>(*this) != rhs);
    }
    T operator*()
    {
        ++count;
        return std::istream_iterator<T>::operator*();
    }

    private:
        size_t  count;
};

int main()
{
    std::set<int>       x;

    //std::copy(std::istream_iterator<int>(std::cin),std::istream_iterator<int>(),std::inserter(x,x.end()));
    std::copy(
                CountIter<int>(std::cin),
                CountIter<int>(5),
                std::inserter(x,x.end())
            );
}

关于c++ - 如何使用 std::copy 读取任意数量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/250096/

相关文章:

c++ - 是否有类似 std::remove() 的东西不保留 vector 保留元素的顺序?

c++ - 等待异步请求完成

c++ - 为 boost logger 设置线程名称

c++ - 如何获取引用 FQDN 的 IP 列表

c++ - 迭代 vector ,边走边删除某些项目

c++ - 前向迭代器的重载

c++ - 为什么一个完美的转发功能必须模板化?

c++ - 递增 back_inserter 是可选的吗?

c++ - 将数据抽样为两组

c++ - std::sort 在 std:vector of pointers 上失败