类别:迭代器,适配器 | 组件类型:类型 |
两者之间的主要区别在于sequence_buffer和back_insert_iterator是back_insert_iterator一次插入一个元素到序列中;sequence_buffer,但是,正如名称中的“缓冲区”部分所暗示的那样,它将元素累积到缓冲区中,并通过一次操作将整个缓冲区追加到容器中。
具体来说,表达式*it = v将v添加到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; }
参数 | 描述 | 默认 |
---|---|---|
容器 | 要写入元素的底层容器的类型。[1] | |
buf_sz | 缓冲区中的元素数。这是一个数字,而不是类型。buf_sz具有类型size_t. | 100 |
成员 | 成员 | 描述 |
---|---|---|
定义位置 | 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(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