SGI

sequence_buffer<Container, buf_sz>

类别:迭代器,适配器 组件类型:类型

描述

Sequence_buffer类似于back_insert_iterator:它是一个输出迭代器 适配器,用于将元素追加到容器的末尾。

两者之间的主要区别在于sequence_bufferback_insert_iteratorback_insert_iterator一次插入一个元素到序列中;sequence_buffer,但是,正如名称中的“缓冲区”部分所暗示的那样,它将元素累积到缓冲区中,并通过一次操作将整个缓冲区追加到容器中。

具体来说,表达式*it = vv添加到it的内部缓冲区的末尾。当缓冲区已满或it被销毁时,缓冲区会自动刷新;刷新缓冲区意味着清空缓冲区并将其内容追加到it的底层容器中。(也可以通过调用flush()成员函数手动刷新缓冲区。)

这种差异有两个含义。首先,sequence_buffer仅在追加N个元素的数组比插入单个元素N次效率高得多时才有用。其次,sequence_buffer假设它可以使用append成员函数在容器的末尾插入元素。此成员函数*不是*容器序列 要求的一部分。sequence_buffer适配器可以与rope一起使用,但不能与库中的任何其他容器一起使用。(这就是为什么sequence_buffer在文件rope.h 中定义,而不是在iterator.h 中定义的原因。)

如果要逐个字符地构建字符串,使用sequence_buffer比重复将单个字符添加到rope.

示例

int main()
{
  const char* const s = "this is a test";
  const int N = strlen(s);

  crope r;
  transform(s, s + N,
            sequence_buffer<crope>(r),
            toupper);
  cout << "r = " << r << endl;
}

定义

在头文件rope 和向后兼容的头文件rope.h 中定义。sequence_buffer类和rope 头文件是 SGI 扩展;它们不是 C++ 标准的一部分。

模板参数

参数 描述 默认
容器 要写入元素的底层容器的类型。[1]  
buf_sz 缓冲区中的元素数。这是一个数字,而不是类型。buf_sz具有类型size_t. 100

模型

输出迭代器.

类型要求

公共基类

output_iterator

成员 成员 描述
定义位置 sequence_buffer value_type
底层容器的值类型。 sequence_buffer sequence_buffer(Container& C)sequence_buffer创建一个,其底层容器为.
C sequence_buffer() 默认可构造
默认构造函数。生成的迭代器是奇异的。 sequence_buffer(const sequence_buffer&) 可赋值
复制构造函数。 sequence_buffer(const sequence_buffer&) sequence_buffer& operator=(const sequence_buffer& s)
赋值运算符。 sequence_buffer(const sequence_buffer&) sequence_buffer& operator=(sequence_buffer& s)
更快版本的赋值运算符。 输出迭代器 sequence_buffer& operator=(const value_type&)用于实现输出迭代器 要求. [2]
*i = t 输出迭代器 sequence_buffer& operator=(const value_type&)用于实现输出迭代器 要求. [2]
sequence_buffer& operator*() 输出迭代器 sequence_buffer& operator++()
前缀递增 输出迭代器 sequence_buffer& operator++(int)
后缀递增 sequence_buffer void flush()
刷新缓冲区。 sequence_buffer void push_back(value_type)i.push_back(x)等效于.
*i = x sequence_buffer void append(value_type* s, size_t len)

追加多个值。

新成员sequence_buffer.
这些成员未在输出迭代器 要求中定义,而是特定于 描述
定义位置 函数底层容器的值类型。也就是说,.
底层容器的值类型。 sequence_buffer(Container& C)sequence_buffer创建一个,其底层容器为typename Container::value_typesequence_buffer。追加到,其底层容器为的元素将在sequence_buffer刷新时追加到
后缀递增 。将缓冲区中的所有元素追加到底层容器,并清空缓冲区。也就是说,使底层容器与sequence_buffer保持一致。请注意,flush会在缓冲区已满时自动调用,也会在sequence_buffer的析构函数中调用。但是,有时需要确保在特定时间刷新缓冲区。
void push_back(value_type x) x追加到sequence_buffer。请注意,此成员函数严格来说是不必要的void push_back(value_type)只是等效于.
*i = x 的另一种语法追加范围追加到sequence_buffer保持一致。请注意,[s, s + len)i.append(s, n)copy(s, s + n, i)append相同。但是,

成员函数更快。

备注容器[1] 尽管名为“sequence_buffer”,但此适配器实际上不能与任意序列一起使用:它要求模板参数append具有sequence_buffer成员函数,该函数可以在容器的末尾插入多个元素。此成员函数不是序列 要求的一部分。这意味着rope可以与

一起使用,但不能与任何其他预定义的容器类一起使用。sequence_buffer[2] 请注意如何通过实现赋值。通常,一元operator*必须定义为返回代理对象,其中代理对象定义operator=sequence_buffer以执行输出操作。在这种情况下,为了简单起见,代理对象是本身。也就是说,*i只是返回i用于实现输出迭代器 要求i.push_back(x),而i = t

。但是,您不应依赖此行为。这是一个实现细节,不能保证在将来的版本中保持不变。

输出迭代器, rope, 另请参阅, back_insert_iterator, front_insert_iterator
[Silicon Surf] [STL Home]
insert_iterator 版权所有 © 1999 Silicon Graphics, Inc. 保留所有权利。