如何一般有效地填充缓冲区? (通过插入迭代器?容器?等)

时间:2012-07-07 05:25:26

标签: c++ stl iterator buffer

如果我正在创建一个需要填充缓冲区的方法(例如,fread的包装器),并且在某些情况下(在运行时确定),它可以创建一个很好地猜测所需的缓冲区大小,为了利用这个机会我应该传递给这个方法,同时仍然允许任何合理的缓冲区而不需要用户多次调用?

  • 喜欢使用insert_iterator,但我不能告诉它保留一定数量的内存。

  • 另一方面,如果我将容器作为模板参数传递,我会遇到麻烦,因为容器没有标准接口! (例如vectorstringreserve,但dequelist没有。或者容器可能没有push_back - 我不相信我已经看到这是强制性的等等。)

那么在这样的情况下做什么是适当的?

2 个答案:

答案 0 :(得分:2)

您可以创建非常通用的函数来获取迭代器,然后创建一系列更专业的函数,这些函数采用各种序列容器类型(vector,list,deque,string),并在转发到更通用的函数之前采取适当的操作,例如:

template<typename OutputIterator>
fill_buffer_iterator_version(OutputIterator it)
{
    // fill data through output iterator
} 

// default generic version uses back_inserter, all standard
// sequence containers support push_back
template<typename Container>
fill_buffer(Container & c)
{
    fill_buffer_iterator_version(std::back_inserter(c));
}

// specialize for vector   
fill_buffer(std::vector<char> & v)
{
    v.reserve(100);
    fill_buffer_iterator_version(std::back_inserter(v));
}

答案 1 :(得分:0)

您知道要读取多少字节,因此在调用resize之前使用fread方法。通过,begin到它。或者,在自定义(模板化)版本中,您可以传递容器(通过引用),在“文件读取”之前为它分配内存并执行相同的操作。