STL std :: remove_copy

时间:2017-11-18 06:11:19

标签: c++ stl

 std::remove_copy

 template <class InputIterator, class OutputIterator, class T>  
 OutputIterator remove_copy (InputIterator first, InputIterator last,
                               OutputIterator result, const T& val);
  

复制范围删除值,复制范围中的元素   [first,last]到结果开始的范围,除了那些元素   比较等于val。输出容器必须足够大   保持结果。

Q1。 为什么输出容器的大小必须足够大才能保存结果?容器不会自行生长吗?

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

2 个答案:

答案 0 :(得分:2)

  

为什么输出容器的大小必须足够大以容纳   结果?容器不会自行生长吗?

没有。怎么可能呢?所有的算法都是迭代器,你不能从它的迭代器访问容器的成员函数(这是为了扩展容器所需的)。但是,有一些特殊用途的迭代器,它们知道如何生成容器。 std::front_insert_iteratorstd::back_insert_iteratorstd::insert_iterator,其中包含对容器的引用,并在取消引用时分别调用[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [43] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [85] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 elas2 = function(P) { P/(sum(u) + P) } dat$y2 = elas2(x) plot(dat$x, dat$y2, type="l", lwd=2, ylim=c(0,0.4)) plot(elas2, 0, 6, lwd=2, ylim=c(0,0.4)) curve(elas2, 0, 6, lwd=2, ylim=c(0,0.4)) push_front分配给。

  

为什么输出容器中的先前内容会在i时被覆盖   执行remove_copy?

因为这就是算法的工作原理。这就是所有标准库算法的工作原理。他们对容器一无所知。并非所有迭代器都来自容器。并非所有容器都可以生长。如果要附加到容器,请使用push_back,如上所述。您可以使用std::back_inserter帮助程序功能方便地创建一个,而无需指定模板参数。例如:

insert

答案 1 :(得分:0)

  

为什么输出容器的大小必须足够大以容纳   结果?容器不会自行生长吗?

算法对序列进行操作。容器是创建序列的一种方式,但它们不是唯一的方法。所以,是的,每当你访问结束时,可以编写一个容器来增长,但序列通常不会这样做。

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

  

为什么输出容器中的先前内容会在i时被覆盖   执行remove_copy?

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