如果我正在创建一个需要填充缓冲区的方法(例如,fread
的包装器),并且在某些情况下(在运行时确定),它可以创建一个很好地猜测所需的缓冲区大小,为了利用这个机会我应该传递给这个方法,同时仍然允许任何合理的缓冲区而不需要用户多次调用?
我喜欢使用insert_iterator
,但我不能告诉它保留一定数量的内存。
另一方面,如果我将容器作为模板参数传递,我会遇到麻烦,因为容器没有标准接口! (例如vector
和string
有reserve
,但deque
和list
没有。或者容器可能没有push_back
- 我不相信我已经看到这是强制性的等等。)
那么在这样的情况下做什么是适当的?
答案 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
到它。或者,在自定义(模板化)版本中,您可以传递容器(通过引用),在“文件读取”之前为它分配内存并执行相同的操作。