1

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

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

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

那么在这样的情况下,什么是合适的做法呢?

4

2 回答 2

2

您可以创建带有迭代器的非常通用的函数,然后创建一系列更专业的函数,这些函数采用各种序列容器类型(向量、列表、双端队列、字符串),并在转发到更通用的函数之前采取适当的操作,例如:

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));
}
于 2012-07-07T05:52:10.140 回答
0

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

于 2012-07-07T05:40:15.393 回答