STL std::remove_copy

STL std::remove_copy

本文关键字:copy remove STL std      更新时间:2023-10-16
std::remove_copy
template <class InputIterator, class OutputIterator, class T>  
OutputIterator remove_copy (InputIterator first, InputIterator last,
OutputIterator result, const T& val);

复制范围移除值,复制范围中的元素[第一个,最后一个)到从结果开始的范围,除了那些元素的值。输出容器必须足够大以保持结果。

q1.为什么输出容器的大小必须足够大才能容纳结果?这个容器能自己长吗

q2.为什么在执行remove_copy时会覆盖输出容器中以前的内容即,当我执行remove_copy(a.begin(),a.end(),b.begin(),' ');时,容器b中以前的内容会丢失,它们会被新内容替换,为什么会这样?为什么remove_copy的结果没有附加在输出容器的开头?

为什么输出容器的大小必须足够大才能容纳后果这个容器能自己长吗?

否。怎么可能呢?所有的算法都是迭代器,你不能从它的迭代器访问容器的成员函数(这是扩展容器所必需的)。然而,也有一些特殊用途的迭代器知道如何扩展容器。std::front_insert_iteratorstd::back_insert_iteratorstd::insert_iterator,它们保存对容器的引用,并在它们被取消引用和分配给.时分别调用push_frontpush_backinsert

为什么当i是否执行remove_copy?

因为这就是算法的工作方式。这就是所有标准库算法的工作方式。他们对集装箱一无所知。并非所有迭代器都来自容器。并不是所有的容器都是可种植的。如果要附加到容器,请使用std::back_insert_iterator,如上所述。您可以使用std::back_inserter帮助器函数来方便地创建一个,而无需指定模板参数。例如:

std::remove_copy(source.begin(), source.end(), std::back_inserter(dest), value);

为什么输出容器的大小必须足够大才能容纳后果这个容器能自己长吗?

算法对序列进行操作。容器是创建序列的一种方法,但它们不是唯一的方法。所以,是的,容器可以被编写为在任何时候访问时都会增长,但序列通常不会做到这一点。

如果您有一个容器,可以使用std::inserter创建一个输出迭代器,根据需要扩展容器。

为什么当i是否执行remove_copy?

它可能是,也可能不是,这取决于输出迭代器的作用。如果它是容器中的迭代器(而不是insert_iterator),那么它只能访问已经存在的元素,因此必须覆盖它们。如果它是输出流中的迭代器,那么它只向流中写入元素;没有任何内容被覆盖。